Skip to content
On this page

Java OOP

继承

定义

多个类具有相似的属性方法,抽象出作为父类。子类可以访问父类 的所有非私有属性。私有属性可以通过共有方法来访问。

语法

子类 extend 父类

super

super(),调用父类构造器。默认可以不写。可以通过传参来指定(显式调用)父类构造器。只能在构造器第一行调用。不能和 this()同时使用。

super 调用时不仅限父类。同名遵顼就近原则。

注意:如果父类某属性设置 private,子类无法访问,也无法绕过访问爷类同名属性。

作用

减少代码冗余。不用把一样的属性和方法再写一遍。

重载

定义

子类和父类具有相同的方法名称,形参,返回。子类的方法覆盖父类的方法。

  • 子类返回类型和父类一致,或者是父类返回类型的子类。

    java
    public class Father(){
    
        public Object m1(){
            return null;
        };
    
    }
    
    public class Son extends Father(){
        public String m1(){
            return null;
        };
    }
  • 子类不可以缩小父类的访问权限

    public>protected>默认>private

重写与重载

发生范围方法名参数列表返回类型修饰符
overload 重载本类一致类型,个数或者顺序至少有一个不同无要求无要求
override 重写父子类一致一致一致,或者子类返回类型是父类 返回类型的子类子类不能缩小

多态

方法和类具有多种形态。建立在封装和继承的基础上。

继承是多态的前提。

重载和重写是多态 的体现。

对象的多态

  • 一个对象的编译类型和运行类型可以不一致

    java
    Animal animal = new Dog();
  • 父类的引用可以指向子类

  • 属性看编译类型,方法看运行类型

  • 对象的编译类型被定义时就已经确定了,无法改变。运行类型可以改变。

向上转型

本质:父类的引用指向子类的对象。

对象可以调用父类所有成员。遵循访问权限。子类特有类型不能访问。因为对象可以调用哪些成员,是由编译类型决定的。

向下转型

前提条件:

  1. 子类类型:转型的目标类型必须是源对象的实际子类类型。
  2. 对象名指向转换的对象类型:源对象必须是通过父类引用指向的实际子类对象。

语法:子类类型 对象名 = (子类类型) 父类对象名 ;

java
Animal animal = new Cat();
Cat cat = (Cat) animal;

人话:堆中本来就创建了一个 Cat 对象,拥有 Cat 类型的全部成员,转型改变的只是这些成员的访问权限。

动态绑定机制

调用对象方法时,该方法会和该对象(运行类型)的内存地址/运行类型绑定。属性不会。

java
class A {
	int count = 10;

	public int sum(){
		return count + 10;
	}

    public sum1(){
        return sum()+count;
    }
}

class B extends A {
	int count = 20;

	public int sum(){
		return count + 20;
	}
}

class demo{
	static public void main(String[] args){

		A a = new B();

        a.sum();//40
        a.sum1();//50

	}
}