继承的讲解

简介: 继承的讲解

hi,大家好,今天为大家带来继承的知识点


🚀1.继承的定义

🚀2.继承的语法

🚀3.访问父类

🚀4.super关键字

🚀5.子类和父类构造方法的讲解

🚀6.super和this的区别

🚀7.继承关系上的执行顺序

🚀8.protected关键字

🚀9.继承方式

🚀10.final关键字的讲解


part I


继承的定义,用普通的大白话来说,就是对拥有共性的代码进行抽取,放在一个类里面,然后让其他类去继承它,在这里要注意,类之间的继承都是单继承,多继承出现在接口中,我们之后讲到接口的时候再说


part II


继承用extends,继承的类叫做子类,被继承的类叫做父类


就像儿子继承父亲的遗产一样,在子类继承父类的过程中,子类会将父类拥有的成员方法和成员变量都继承过来,但是子类也要有自己的成员


下面上一段代码来看看


class Animal{
    public String name;
    public int age;
    public void wash(){
        System.out.println(name+"正在洗澡");
    }
}
class   Cat  extends  Animal {
    public void xiaomi() {
        System.out.println(name + "正在喵喵叫");
    }
}
    class Dog extends Animal{
        public void xiaowang(){
            System.out.println(name+"正在汪汪叫");
        }
    }
public class TestDemo {
    public static void main(String[] args) {
        Cat cat=new Cat();
        cat.name="咪咪";
        cat.age=2;
        cat.wash();
        cat.xiaomi();
        Dog  dog=new Dog();
        dog.name="贝贝";
        dog.age=3;
        dog.xiaowang();
        dog.wash();
    }
}


animal就是猫和狗的父类


访问原则:如果访问的成员变量子类中有,优先访问自己的成员变量。

如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

如果访问的成员变量与父类中成员变量同名,则优先访问自己的。


成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找

总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时

再到父类中找,如果父类中也没有则报错。

子类在构造时要优先帮助父类完成构造


class Base {
    public int a;
    public int b;
    public int c = 199;
    public void methodBase() {
        System.out.println("Base");
    }
}
class Derived extends Base {
    public int c = 9;
    public void methodDerived() {
        System.out.println("Derived");
    }
    public void methodBase(int a) {
        System.out.println("Derived");
    }
    public void func() {
        System.out.println(super.a);
        super.methodBase();
        methodDerived();
    }
    public void func1() {
        //子类有 那么就拿子类的 子类没 就拿父类的
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);//如果父类 和子类 有同名的成员变量,优先访问 子类自己的
        System.out.println(super.c);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.func();
    }
}


通过这段代码我们可以发现访问父类要加super.


1.若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法,

2.

如果父类构造方法是带有参数的,此时编译器不会再给子类生成默认的构造方法,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。


a0b4a1c8acec41a7aaa8907469790268.png

3ff25745ad904db6982f2b8f6715b527.png

b65f9c1fab0448af892c72decddbca30.png


当父类Animal中有显示的构造方法时,子cat子类中就不用再写这个super()了,编译器提供了这个,只是被影藏了,但是写了也不报错,你写了他就不给你提供了



这个就是说父类明确给出了带参数的构造方法,那么就要使用适合的super()


方法去帮助父类构造


现在再来说一说super和this的区别

 首先:super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句

所以它俩不能出现在同一个构造方法中;

并且只能在非静态的方法中使用

this是当前对象的引用

super相当于是子类对象中从父类继承下来部分成员的引用;

那么学了继承,我们就可以了解protected了,其实很简单,就是被它修饰的成员变量或者成员方法可以在不同包的子类中被访问,就是在使用时,导入继承的父类的包即可

继承方式刚刚也提到过了,就是简单的1单继承,2.多层继承3.多个类继承一个父类

若一个类被final修饰了,那么就不能被继承了,

若是一个成员变量被final修饰,那么必须给他赋初值;

//代码块在继承关系中执行顺序:

父类静态代码块优先于子类静态代码块执行,且是最早执行

2、父类实例代码块和父类构造方法紧接着执行

3、子类的实例代码块和子类构造方法紧接着再执行

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

静态代码块在类加载的时候就被执行,且只执行一次

以上就是今天给大家带来的内容,下期再见了,886!!!

相关文章
|
6天前
|
C++
8. C++继承
8. C++继承
28 0
|
6天前
|
安全 程序员 编译器
C++之继承
C++之继承
|
6天前
|
存储 编译器 C++
C++中的继承
C++中的继承
12 0
|
6天前
|
存储 安全 编译器
|
6天前
|
存储 设计模式 Java
C++【继承】
C++【继承】
47 0
|
6月前
|
程序员 编译器 C++
|
7月前
|
设计模式 编译器 程序员
继承【C++】
继承【C++】
21 0
|
11月前
|
程序员 编译器 C++
|
12月前
|
存储 安全 Java
继承
继承是一种is-a的关系,而组合是一种has-a的关系。如果两个类之间是is-a的关系,使用继承;如果两个类之间是has-a的关系,则使用组合;如果两个类之间的关系既可以看作is-a的关系,又可以看作has-a的关系,则优先使用组合
|
12月前
|
C++
【C++】继承(下)
【C++】继承(下)
55 0