JAVA笔记-面向对象三大特性(继承)

发布于:2022-12-24 ⋅ 阅读:(501) ⋅ 点赞:(0)

在这里插入图片描述

继承的基本介绍

​ 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性【变量】
和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类
不需要重新定义这些属性和方法只需要通过继承父类即可

语法

class 子类 extends 父类{

}

案例
public static void main(String[] args) {
    B b = new B();
    b.name = "jack";
    b.dal;
}
class A{
    public String name;
    public void dal(){
       System.out.println("父类的方法");
   }
}
class B extends A{
    
}
继承的使用细节:
  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问
    但是私有属性不能再子类直接访问,需要通过公共的方法去访问

  2. 子类必须调用父类的构造器,完成对父类的初始化

  3. 当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类
    的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用
    【super】去指定使用父类的哪一个构造器完成对父类的初始化工作

  4. 如果希望指定调用父类的某个构造器,则显试的调用一下:super(参数列表);

  5. super在使用时,必需放在构造器第一行

  6. super() 和 this() 都找你放在构造器第一行,因此两个方法不能共存在一个构造器

  7. JAVA所有类都Object类的子类

  8. 父类构造器的调用不限于直接父类,将一直往上追溯到Object类

  9. 子类最多只能继承一个父类(指直接继承),即JAVA中是单继承机制

  10. 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

细节案例
    public static void main(String[] args) {
        Son son = new Son();
        //按查找规则返回信息
        //先从子类开始查找,如果有并且可以访问,则返回
        //如果子类没有就向上查找,如果父类有并且可以访问,则返回
        //如果父类也没有继续向上访问,直到object
        System.out.println(son.name);
        System.out.println(son.getAge());
        System.out.println(son.hobby);
    }
}
class GrandPa{
    String name = "金木研";
    String hobby = "喰";
}
class Father extends GrandPa{
    String name = "雾岛董香";
    private  int age = 18;
    //如果不能访问私有属性或方法,就提供一个公有的属性或方法
    public int getAge() {
        return age;
    }
}

class Son extends Father{
    String name = "金雾";
}

super关键字基本介绍

代表父类引用,用于访问父类的属性,方法,构造器

基本语法
  1. 访问父类的属性,但不能访问父类的private属性
    super.属性名;

  2. 访问父类的方法,不能访问父类的private方法
    super.方法名(参数列表);

  3. 访问父类的构造器
    super(参数列表); 注意只能放在构造器的第一句

案例
class A{
    //属性
    public String name;
    
    //构造器
    public A(String name){
        this.name = name;
    }
    
    //方法
    public void say(){
        System.out.println("父类的say方法");
    }
}
class B extends A{
    
    public B(String name){
        super(name);
    }
    
    public void say(){
        System.out.println("子类的say方法");//和父类构成了重写
    }
    
    public void okj(){
        //System.out.print(super.name);
        super.say();;//super查找顺序直接查找父类,如果父类没有则继续向上查找
    }
}
super给编程带来的便利和细节
  1. 调用父类构造器的好处,分工明确,父类属性由父类初始化,子类的属性由子类初始化
  2. 当子类中有和父类的成员【属性和方法】重名时,为了访问父类的成员,必须通过super
    如果没有重名,使用super,this,直接访问是一样的效果
  3. super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员
    如果多个基类【上级类】中都有同名的成员,使用super访问遵循就近原则,也需要遵守访问权限的相关规则

super 和 this 的区别为,一个是直接跳到父类开始查找,一个是从本类开始查找

方法(重写/覆盖)基本介绍

​ 方法重写就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样那么我们就说子类的这个方法覆盖了父类的方法

案例
public static void main(String[] args) {
    B b = new B();
    b.aa();
}
class A{
    public void aa(){
        System.out.println("父类aa方法被子类重写");
    }
}
class B extends A{
    public void aa(){
        System.out.println("子类重写父类的aa方法");
    }
}
注意事项和使用细节
  1. 子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样
  2. 子类的返回类型和父类的返回类型一样,或者是父类返回类型的子类
    比如:父类返回类型是Object ,子类返回类型是String
  3. 子类方法不能缩小父类方法的访问权限,可以放大父类的访问权限