【学习笔记】继承

继承

继承的本质是对某一批类的抽象,从而实现对世界更好的建模

就像动物又分为哺乳动物、爬行动物等。

 

extends 的意思是“扩展”,子类是父类的扩展,我们通过extends来实现子类对父类的继承

 

继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合

继承关系的两个类,一个为子类(派生类),一个为父类(基类)子类继承父类,使用extends关键字

子类和父类之间,从意义上将应该具有“is a”的关系

子类继承了父类,就拥有了他的所有的公共的属性和方法

 

父类:

package com.oop.demo04;
​
public class Person {
    private int money = 10_0000;
    public void sayHello(){
        System.out.println("Hello");
    }
​
    public int getMoney() {
        return money;
    }
​
    public void setMoney(int money) {
        this.money = money;
    }
}
​

子类:

package com.oop.demo04;
​
public class Student extends Person{
}

应用类:

package com.oop;
​
import com.oop.demo04.Student;
​
public class Application {
    public static void main(String[] args) {
       Student student = new Student();
        System.out.println(student.getMoney());
        student.sayHello();
    }
}

 

快捷键 :ctrl + H 打开类的树形结构

当我们打开这个结构时,可以看到子类在父类下面,即子类继承了父类,但是,需要注意的是父类Person在Object的下面,说明Person继承了Object类。

image-20220718084151032

由此我们知道,

在Java中所有的类,都默认直接或间接继承Object类

在Java中类只有单继承没有多继承,也就是子类只能继承一个父类

 


Super关键字

我们通过super关键字在子类中调用父类的属性和方法,下面来和this关键字区分一下

父类:

package com.oop.demo04;
​
public class Person {
   protected String name = "张三";
}

子类:

package com.oop.demo04;
​
public class Student extends Person{
    public String name = "李四";
​
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}

测试类:

package com.oop;
​
import com.oop.demo04.Student;
​
public class Application {
    public static void main(String[] args) {
       Student student = new Student();
       student.test("王五");
    }
}

image-20220718085627317

 

从输出结果我们可以看出,

this.name 是子类中的属性name

super.name 是父类中的属性name

方法的调用与属性相同

需要注意的是:私有的属性和方法不能被继承,用super关键字也不能调用

 

在new一个子类时,在子类的构造方法中,会先执行 super() 这一语句,也就是先执行父类的构造方法

子类:

package com.oop.demo04;
​
public class Student extends Person{
    public Student(){
        //隐藏代码
        //super();
        System.out.println("我是李四");
    }
    public String name = "李四";
}

父类:

package com.oop.demo04;
​
public class Person {
   public Person(){
      System.out.println("我是张三");
   }
   protected String name = "张三";
}

测试类:

package com.oop;
​
import com.oop.demo04.Student;
​
public class Application {
    public static void main(String[] args) {
       Student student = new Student();
    }
}

image-20220718090418105

 

如果我们自己把super()写出来,它必须放在子类构造器的第一行

 

如果我们在父类中没有写无参构造,那么在子类中就不能调用父类的无参构造,即使是隐藏的也会报错

image-20220718091320863

image-20220718091334763

 


super注意点:

1. super调用父类的构造方法,必须在构造方法的第一行

2.super必须只能出现在子类的方法或构造方法中

3.super和this不能同时调用构造方法

 

VS this:

代表的对象不同:

this: 本身调用者这个对象

super:代表父类对象的引用

前提:

this: 没有继承也可以使用

super:只能在继承条件下使用

构造方法:

this(): 本类的构造

super():父类的构造


重写

重写都是方法的重写,和属性无关

重写之和非静态方法有关,与静态方法无关

静态方法:

package com.oop.demo04;
​
public class A extends B{
​
    public static void test(){
        System.out.println("A=>test()");
    }
}
package com.oop.demo04;
​
public class B {
    public static void test(){
        System.out.println("B=>test()");
    }
}
​
package com.oop;
​
import com.oop.demo04.A;
import com.oop.demo04.B;
​
public class Application {
    public static void main(String[] args) {
        A a = new A();
        a.test();
​
        //B 的引用指向子类
        B b = new A();
        b.test();
    }
}
​

image-20220718094250452

 

如果是静态方法,不存在重写这一概念,方法的调用之和左边定义的数据类型有关,这也就解释了 B b = new A(); 结果是B的方法。

 

下面我们来看非静态方法

image-20220718094629835

去掉static后,我们看到这两个类旁边多了两个小图标,这就是重写的意思

除此之外,我们还可以自动生成重写代码 快捷键alt + insert

 

我们再来运行一下代码,结果是:

image-20220718095010522

B b = new A();
b.test()//结果是A=>test()   这就是子类重写了父类的方法

并且,重写的方法的权限不能是private


总结

重写的前提:需要有继承关系,子类重写父类的方法。

1.方法名必须相同

2.参数列表必须相同

3.修饰符:范围可以扩大 : public>protect>default>private

4.抛出的一场: 范围,可以被缩小,但不能扩大:Excepton---->ClassNotFoundExcepton

重写,子类方法和父类必须一致,方法体不同

 

 

为什么需要重写?

1.父类的功能,子类不一定需要,或者不一定满足

posted @ 2022-07-18 10:03  GrowthRoad  阅读(18)  评论(0编辑  收藏  举报