java面向对象——包+继承+多态(一)-2

简介: java面向对象——包+继承+多态(一)

java面向对象——包+继承+多态(一)-1

https://developer.aliyun.com/article/1503989


protected关键字(重点)

1 在同一个类中

public class time {
    protected int val = 99;

    public static void main(String[] args) {
        time time=new time();
        System.out.println(time.val);
    }
}

此时代码能够正常执行

2 在同一个包中在不同的类

可以看到test与time是在同一个包底下的不同的类,test是可以访问到protected修饰的val

3 不同包底下的子类

在不同包底下,我们要在子类中导入父类,在进行继承,由于是父子类关系,我们要用super关键字对父类中的实例进行访问(super关键字是不能出现在静态方法中的,因为super是对父类对象的引用,是依赖于对象的,而静态方法是属于类的,不依赖于对象)

4 不同包底下的非子类

很明显这是不能进行访问的

访问权限的总结

结合之前我们前面所讲过的public,private,以及包访问权限,现在所学的protected,我们进行一个总结

private:只能在类的内部使用,外部不能进行访问

public:类的外部与内部,同一个包或者不同包下都能进行访问

default(包访问权限):只能在同一个包中进行访问

protected:同一个包,同一个类,不同包的父子类之间都可以进行访问,在父子类中要利用super关键字进行访问,不同包的非子类是不能进行访问的


更复杂的继承关系:(了解)

我们刚才所例举的动物中,对于猫也分为很多种,比如国内的猫种以及国外的猫种,国内的猫种又可以分为那几种等还可以继续细分下去,这种继承关系必须要有逻辑上的联系,不能仅仅为了继承而继承。一般而言我们对于这种复杂的继承关系,一般最好不要超过3层


多态

向上转型(重点)

具体可以看下下列代码

bird bird=new bird(“heihei”,20);


在上面的例子中我们我们知道bird是bird的一个引用,它可以写成下列这种形式


bird bird=new bird(“heihei”,20);

animal bird2 = bird;

//或者写成这个样子

animal bird2 = new bird(“heihei”,20);


此时这种写法就被称作向上转型,也就是父类的引用去引用了子类的对象。


向上转型发生的时机:

1 直接赋值法

这个方法其实就是我们刚才在介绍向上转型的时候所介绍的那个例子。

2 作为返回值

  public static void main(String[] args) {
        animal animal=func();
    }
    public static animal func(){
        bird bird=new bird("gas",39);
        return bird;
    }

3 方法的参数

   public static void main(String[] args) {
        bird bird =new bird("aio",39);
        func(bird);
    }
    public static void func(animal animal){
       animal.eat();
    }

动态绑定(重点)

发生的条件:

1 发生了向上转型(父类引用引用了子类的对象)

2 通过父类的引用,调用父类与子类同名的覆盖方法

动态绑定也被叫做运行时多态(至于具体什么是多态,在下文会具体介绍),也就是在运行时才确定调用的是子类的eat方法

class animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"eat()"+age);
    }
    public animal(String name,int age){
        this.name=name;
        this.age=age;
    }
}
class bird extends animal{
    public bird(String name,int age){
        super(name,age);
    }
    @Override
    public void eat() {
        System.out.println(name+"吃");
    }
    public void fly(){
        System.out.println("fly()");
    }
}
public class blos {
    public static void main(String[] args) {
        animal animal=new bird("hsd",34);
        animal.eat();
    }
}

我们首先可以从main函数入手,可以看到,animal调用用eat方法,可以看到并没有执行父类中的eat方法,而是调用了子类中同名且参数相同,返回值相同的eat方法,此时我们就说发生了动态绑定,而eat方法也被称作覆盖方法,在这个过程我们就说eat发生了重写,并且可以用@override进行标注


静态绑定:

与动态绑定不同,静态绑定在编译时就确定调用了子类的eat方法

public class blos {
    public static void main(String[] args) {
        duck duck=new duck();
        duck.fun("haha");
    }
}
class duck{
    public void fun(){
        System.out.println("无参");
    }
    public void fun(String name){
        System.out.println("一个参数");
    }
    public void fun(String name,int age){
        System.out.println("两个参数");
    }
}

当duck调用fun方法时,给fun传了几个参数,就对应调用那个方法,这个时候我们就说发生了静态绑定,可以知道静态绑定则需要发生在重载的情况下,而动态绑定则需要先发生重写。

重写的注意事项

1 被final修饰的方法不能发生重写

2 被private修饰的方法不能重写

3 被static修饰的方法不能重写

4 子类方法的修饰限定符要大于父类的修饰限定符


重写与重载的区别

1 重写的返回值要一样(这里有个特殊情况,就是可以是协变类型也是可以的),重载是与返回值无关的

2 重写与重载的方法名都要相同的

3 重写的方法参数要一致,重载的方法参数要不同(这里的方法参数包括含参种类以及含参的个数)


结语:

在后面的一篇文章中,我们会继续详细的讲解什么是多态,什么是抽象类,什么是接口。希望本篇文章能够对于你有所帮助!
目录
相关文章
|
8天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
5天前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
|
6天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
15 4
|
5天前
|
Java 数据安全/隐私保护
Java 包(package)的使用详解
Java中的包(`package`)用于组织类和接口,避免类名冲突并控制访问权限,提升代码的可维护性和可重用性。通过`package`关键字定义包,创建相应目录结构即可实现。包可通过`import`语句导入,支持导入具体类或整个包。Java提供多种访问权限修饰符(`public`、`protected`、`default`、`private`),以及丰富的标准库包(如`java.lang`、`java.util`等)。合理的包命名和使用对大型项目的开发至关重要。
|
8天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
10天前
|
Java
Java 多态趣解
在一个阳光明媚的午后,森林中的动物们举办了一场别开生面的音乐会。它们组成了一支乐队,每种动物都有独特的演奏方式。通过多态的魅力,狗、猫和青蛙分别展示了“汪汪”、“喵喵”和“呱呱”的叫声,赢得了观众的阵阵掌声。熊指挥着整个演出,每次调用 `perform()` 方法都能根据不同的动物对象唤起对应的 `makeSound()` 方法,展现了 Java 多态性的强大功能,让整场音乐会既有趣又充满表现力。
|
10天前
|
Java
Java 的继承
在一个森林中,各种动物共存,如狗和猫。为了管理和组织这些动物,我们采用面向对象的方法设计模型。首先创建 `Animal` 超类,包含 `name` 和 `age` 属性及 `makeSound()` 和 `displayInfo()` 方法。接着,通过继承 `Animal` 创建子类 `Dog` 和 `Cat`,重写 `makeSound()` 方法以发出不同的声音。实例化这些子类并使用它们,展示了继承带来的代码重用、扩展性和多态性等优点。这种方式不仅简化了代码,还体现了现实世界的层次结构。
|
11天前
|
Java 开发者
Java 面向对象
Java 是一种面向对象的编程语言,通过对象与类的概念组织代码和数据。面向对象编程的核心包括类、对象、继承、多态、封装和抽象。类是对象的蓝图,定义了属性和行为;对象则是类的实例。继承允许子类继承父类的属性和方法,增强代码复用性;多态则支持通过相同接口调用不同类型对象的行为,包括方法重载和重写。封装通过公共方法隐藏对象细节,提高安全性;抽象则对对象特征进行提炼,通过抽象类和接口实现。理解这些概念有助于设计高效、可维护的 Java 应用程序。
|
5月前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
43 3
|
4月前
|
Java 开发者
Java 面向对象新视界:揭秘子类如何“继承”父类精华,再添“创新”之笔
【6月更文挑战第16天】在Java的面向对象世界,子类继承父类的特性,如`Circle`继承`Shape`,展示“is-a”关系。子类不仅保留父类的`color`和`display`方法,还添加了`radius`属性及定制的显示逻辑。这种继承与创新允许代码复用,增强灵活性和可扩展性,使得构建复杂系统变得更加高效和模块化。通过持续的继承与定制,开发者能构建出一系列独具特色的类,充分展现面向对象编程的力量。
145 57
下一篇
无影云桌面