JAVA关于继承

面向对象的三大特征:封装 继承 多态;

封装:对象代表什么,就得封装对应的数据,并提供数据相应的行为。

引出继承:

在我们封装类的时候是否会发现有些类的部分属性或者部分方法一样呢?我们可不可以简化他们呢?可能会有这样的疑问,比如学生和老师都有名字,职业,家人,都会睡觉,吃饭,说话。那解决这个问题的方法就是把他们相同的属性和方法封装在一个类中,我们可以把这个类当作父类,把老师和学生这两个类当作子类子类中用到的直接在父类中用就行,这个就是Java中的继承

继承:

  •  Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类立继承关系。
  • public class Student extends Person{ }

格式: 

  • public class 子类 extends 父类{}
  • Student 称为子类(派生类),Person称为父类(基类或者超类)。

继承好处:

  • 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性,简化代码。
  • 子类可以在父类的基础上,增加其功能,可以让其变得更强大。

用继承的情况:当类与类存在共性的内容,并满足子类是父类的一种,就可以考虑用继承来优化代码

继承的特点

  • Java只支持单继承不支持多继承,但支持多层继承
  • 单继承:一个子类只能继承一个父类。(一个儿子只能有一个爸爸)
  • 不支持多继承: 子类不能同时继承多个父类。
  • 多层继承:子类A继承父类B,父类B继承父类C,那么父类C为子类A的间接父类,这种继承也叫多层继承
  • Java中每个类都直接或者间接继承于Object(如果当前这个类没有父类会自动继承,这里面有很多的方法); 

不继承多个父类的原因:调用方法的时候,两个父类可能有同一个方法,不知道调用哪个!

子类到底能继承父类中的哪些内容

父类中有的也就:构造方法成员变量成员方法

私有的就是private这种

  • 构造方法 非私有的(不能继承)私有的(不能继承)
  • 成员变量 非私有的(能继承)   私有的(能继承)不过继承下来和能调用是两种概念。在这里不能调用
  • 成员方法 非私有的(能被继承)私有的(不能继承)

构造方法不能继承的原因

父类中有自己的构造方法,如果子类继承了,那么构造方法的名字和子类类名就不一样了,违背构造方法定义规则。

成员变量的继承:

  • 私有的和非私有的都可以继承,就相当于一个有锁一个没锁而已,打开锁的钥匙就是,gets和sets方法。
  • (下面是在黑马程序员上面截屏内存图,希望可以有所帮助)

和之前的内存图不一样的地方

  • 是在加载字节码文件的时候会把父类也加载过来,虽然都会加载Object父类(没有父类的类自动添加的), 
  • 在堆内存创建对象的时候,一部分是存储从父类继承下来的对象,一部分是自己的对象
思考:

在调用一个方法的时候从子类一个一个往上找吗?答案是不会,如果子类A继承父类B,父类B继承父类C,A->B->C,他会在C中生成一个虚方法表,传给他的子类B,B在此基础上添加自己的虚方法表以此类推,

虚方法表就是这个类中常用的方法。非private,非static,非final。

继承中构造方法的访问特点

  • 父类中的构造方法不会被子类继承,但是可以被访问
  • 子类中所有的构造方法默认先访问父类中的空参构造(通过super()关键字来访问),再执行自己
  • (因为只有通常通过super()关键字来访问访问过父类的构造方法后,父类的成员变量才会被初始化,子类才可以继承。)
  • 子类构造方法的第一行,有一个默认的super();
  • 如果想要访问父类的有参构造,可以手写一个。
怎么调用父类的构造方法?
  • 子类构造方法的第一句默认都是:super(),不写也存在,且必须在第一行。(super()代表调用父类的无参构造)
  • 如果想调用父类的有参构造,必须进行手动的ssuper进行调用。

在下面这个程序中会输出夫类的空参构造子类的空参构造

class Person{//父类
        
        String name;
        int age;
    
        publid Person(){//空参构造
        System.out.println("夫类的空参构造");
    }
}
class Student extends Person{//子类
    public Student(){
        //子类的构造方法中隐藏的super()去访问父类的无参构造
        super();//必须在第一行,前面不能有输出语句。
        System.out,println("子类的空参构造");
    }
}
public class Test{
    public static void main(String [] args){
        Student s1=new Student();//调用了空参构造
    }
}

如果想访问父类的有参构造方法要怎么做呢?这个时候就要用到带参构造了。

就是在super()括号内填入数据

class Person{//父类
        
        String name;
        int age;
    
        publid Person(){//空参构造
        System.out.println("夫类的空参构造");
        
        public Person(String name,int age){//有参构造
            this.name=name;
            this.age=age;
        }
    }
}
class Student extends Person{//子类
    public Student(String name,int age){
        /*子类的构造方法中隐藏的super()去访问父类的无参构造,在super()中添加数据可以通过带参构造来访问父类*/
        super(name,age);//必须在第一行,前面不能有输出语句。
        System.out,println("子类的空参构造");
    }
}
public class Test{
    public static void main(String [] args){
        Student s1=new Student("张三",28);//调用了带参构造
    }
}

this super()使用总结 :

this:理解为一个变量,表示方法调用者的地址值。

super():代表父类存储空间。


关键字               访问成员变量           访问成员方法             访问构造方法

this        this.成员变量                 this.成员方法()           this.()
            访问本类成员变量               访问本类成员方法           访问本类构造方法

super        super.成员变量               super.成员方法()          super()
             访问父类成员变量              访问父类成员方法           访问父类构造方法

this.()访问本类构造方法可能有人不懂,写一段代码.

public class Student{

    STring name;
    int age;
    String school;
    
    public Student(){
    //this.表示调用其他构造方法
    /*细节,在调用this后不会调用super()了因为this.调用其他构造方法的时候,其他构造方法会调用super()*/
    this.(null,0,"平顶山学院");
    }
    public Student(String name ,int age,String school){
    this.name=name;
    this.age=age;
    this.school=school;
    }
}
    

ok.完毕。 

 

你可能感兴趣的:(JAVA关于继承)