继承相关知识

什么是继承

  1. 什么是继承:继承就是将相同属性和行为的类向上提取,形成父类。
  • 继承语法:使用extends关键字,public class Cat extends Animal {…}
  1. 语言特点:
  • 在Java中,支撑但继承(也就是说一个子类只能继承一个父类)。
  • 一个父类可以有多个子类继承。
  • 支持多层继承。
  • 父类的构造方法不参与继承。
  • 父类私有化的变量不参与继承。
  1. 优点与缺点:
  • 优点(提高代码的复用性,维护性【指的是:修改父类逻辑,子类逻辑也跟随变化】)
  • 缺点:类与类之间产生了父子关系,增加了耦合性。(软件设计的原则是:高内聚,低耦合)
  1. 变量访问原则:
  • 变量访问依据就近原则:现在局部范围寻找,有就是用,没有就在本类成员范围寻找,有就使用,没有就在父类范围寻找,有就是用,没有就报错。
  • 如果所有变量名都相同时,就只能访问就近的局部变量。
  • 要想访问其他变量就要使用关键字:this表示本类对象引用(this.变量名—就会访问本类变量),super表示父类引用(super.变量名----就会访问父类变量)

构造方法的调用

  1. 有了继承之后,子类在初始化的时候可能用到父类的数据,所以会先初始化父类。
  2. 所以子类里面必须有调父类构造方法的逻辑,因此构造方法默认第一个语句体就是:super(),【它就是调父类的空参构造方法语句】
  3. 这就就会一直向上调取构造方法:因此Java中有一个顶层的父类【object】,这就是最终的父类。
  4. 当我们创建构造方法时:就在语句体的第一行默认写出super(),但是当父类没有无参构造时(就会出现下列报错)

解决方法:

  • 创造无参构造。
  • 通过有参构造简介完成父类的初始化。

java继承次序 java继承的原则_java继承次序


java继承次序 java继承的原则_多态_02

  • 子类的无参构造中,访问父类的有参构造也可以完成父类的初始化。
Cat cat = new Cat();
创建对象是。类的加载顺序
1.先是父类的class文件加载,然后是子类的class文件夹加载。
2.执行父类的构造方法,再执行子类的构造方法。方法重写

方法重写

  1. 什么是方法重写:
  • 当子类和父类出现相同方法时(方法名,返回值类型,返回值三者相同时就是相同方法),就会发生子类方法覆盖父类方法,这就是方法重写。
  • 方法重写的用途:1.当对父类的方法执行的功能不满意或者想要扩展功能时,子类可以通过方法重写完成新的逻辑功能。
  • 方法重写的快捷方式:ctrl +o ,重写父类方法
@Override
    public void sleep() {
        System.out.println("重写父类方法");
    }
  • 扩展父类方法:
@Override
public void sleep() {
    super.sleep();
    System.out.println("扩展功能逻辑");
}

注意:

super.sleep();是继承父类方法的语句。

@Override 是方法重写的判断提示。

//父类方法
private void sleep(){
            System.out.println("睡觉");
 }
        
//子类方法
@Override
public void sleep() {
    System.out.println("重写父类方法");
}

注意:虽然子类的方法名,返回值,返回值类型和父类的相同,但是这不是方法重写,因为父类的方法是私有的,不能被继承。@Override会提示。

  1. 方法重写的注意事项:
  1. 父类的私有方法不能重写,因为私有方法不能继承。
  2. 父类的方法的权限修饰应该小于或者等于子类的方法权限修饰,最好权限是一致的。
  3. 父类的方式是静态的,子类的方法也要是静态的(其实算不上重写,因为静态方法,是随着类的加载而加载的)

final关键字

  1. 为什么出现final关键字,因为父类的有些信息不想被子类重写,就用final修饰,意为最终的意思。
  2. final可以修饰:变量、方法、类。
  3. final修饰后的特点:
  • 修饰类:类不能被继承
  • 修饰方法:方法不能被重写
  • 修饰变量:变量不能被重新赋值
    修饰局部变量
  • 基本类型的变量:不能重新赋值
  • 引用类型的变量:引用类型的地址值不能被修改。
    )

多态基本知识:

  1. 概念:多态就是不同事物在不同时刻的状态。
    Cat cat=new Cat(); 猫在某个时刻是猫
    Animal a=new Cat(); 也可以在某个时刻是动物
  2. 多态的前提;
  • 要有继承
  • 要有方法重写(没有语法不会报错,但是多态就没有意义)。
  • 要有父类引用 指向子类对象(Father fu=new Son();).

多态中的成员访问特点:

  1. Father fu = new Son();

编译

运行(结果)

成员变量

左边(父类)

左边(父类)

成员方法

左边(父类)

右边(子类)

静态方法

左边(父类)

左边(父类)

构造方法:子类创建对象是,会先访问父类构造方法,初始化父类数据。

  1. 多态的好处:
  • 提高了代码的复用性(继承保证)
  • 提高了代码的扩展性(多态保证)
  1. 多态的弊端:
  • 多态形式不能使用子类特有的功能。
  • 解决方法:向下转型。把父类引用强制转化为子类引用(Zi zi= (Zi) fu);
  • 向上转型:就是把子类转成父类引用(多态本身就是向上转)

分析:

class A {
		public void show() {
			show2();
		}
		public void show2() {
			System.out.println("我");
		}
	}
	class B extends A {
		public void show2() {
			System.out.println("爱");
		}
	}
	class C extends B {
		public void show() {
			super.show();
		}
		public void show2() {
			System.out.println("你");
		}
	}
	public class DuoTaiTest4 {
		public static void main(String[] args) {
			A a = new B();
			a.show();
			B b = new C();
		b.show();
	}
}    结果:爱 你

抽象类的概念和特点:

  1. 概念:我们在上述案例中提出了具体对象 猫 ,狗 等。向上抽取到动物类,但是动物类中我们给出了具体的吃饭,睡觉等方法,其实对于抽象的动物我们不应该给出具体的方法。而是应该给一个声明即可。
  2. 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
  3. 抽象类和方法必须abstract修饰,
  4. 抽象类的特点:
  • 抽象类不一定有抽象方法,抽象方法所在的类一定是抽象类
  • 抽象类可以有构造方法,但是不能实例化,那么构造方法有什么用,
  • 用于子类访问父类数据的初始化
  • 抽象类不能直接实例化,该怎么实例化
  • 利用多态的方式,有具体的子类进行实例化。
  • 抽象类的子类
  • 要么是抽象类
  • 要么重写抽象类中的所有抽象方法