【java】继承

java继承

  • 继承的基本概念
  • super、this
  • 构造方法

继承的基本概念

面向对象中有3个重要的特征:继承、封装、多态。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

一个类只能有一个父类,不能存在多个父类;但一个父类可以有多个子类。

生活中的继承:
【java】继承_第1张图片
继承采用extends语法:子类 extends 父类

class Parent{
	String name = "zhangsan";
	void test(){
		System.out.println("test");
	}
}
class Child extends Parent{
}

super、this

如果当子类也有name属性,父类也有name属性,这个时候子类的name是子类的呢还是父类的呢?

public class chapter06  {
    public static void main(String[] args) {

        Child1 c = new Child1();
        c.test();

    }
}
class Parent1 {
    String name = "zhangsan";
}
class Child1 extends Parent1 {
    String name = "lisi";
    void test() {
        System.out.println(name);
    }
}

【java】继承_第2张图片

可以看到结果:lisi,说明当属性相同时,子类优先使用自己的属性,但这样我们的父类属性去哪了呢,要怎么调用呢?

这个时候,就需要使用super、this的关键字来进行区分。

public class chapter06  {
    public static void main(String[] args) {

        Child1 c = new Child1();
        c.test();

    }
}
class Parent1 {
    String name = "zhangsan";
}
class Child1 extends Parent1 {
    String name = "lisi";
    void test() {
        System.out.println(super.name);
        System.out.println(this.name);
        System.out.println(name);
    }
}

【java】继承_第3张图片

构造方法

public class chapter07 {
    public static void main(String[] args) {

        Child2 c1 = new Child2();
        Child2 c2 = new Child2();
        Child2 c3 = new Child2();

    }
}
class Parent2 {
}

class Child2 extends Parent2 {
}

我们可以看到以上代码,我们创建了三个子类的对象,这个时候有个问题是,子类对象是创建了三个,但父类对象创建了多少呢?是创建了一个,还是创建了三个呢?

我们知道,创建对象时会调用我们的构造方法,所以可以在类里面添加构造方法来进行查看,父类到底创建了几个。

public class chapter07 {
    public static void main(String[] args) {

        Child2 c1 = new Child2();
        Child2 c2 = new Child2();
        Child2 c3 = new Child2();

    }
}
class Parent2 {

    Parent2 () {
     
        System.out.println("parent...");
    }
}
class Child2 extends Parent2 {

    Child2() {
        System.out.println("child...");
    }
}

【java】继承_第4张图片
可以看到结果,父类对象也创建了三次。
所以从类的角度来讲,不同的子类确实有相同的父类。【java】继承_第5张图片
但从对象的角度来说,一个子类对象对应一个父类的对象,这些父类对象的名字相同而已。其实,准确来说,没有父类对象这个概念,不过是子类继承到父类的属性和方法,然后开辟的一块内存空间。
【java】继承_第6张图片
父类对象是在子类对象创建前创建完成,创建子类对象前,会调用父类的构造方法完成父类的创建。

默认情况下,子类对象构建时,会默认调用父类的构造方法完成父类对象的创建。使用的是super的方式,只不过JVM自动完成。

public class chapter07 {
    public static void main(String[] args) {

        Child2 c1 = new Child2();
        Child2 c2 = new Child2();
        Child2 c3 = new Child2();

    }
}
class Parent2 {

	String username;

    Parent2 (String name) {
        username = name;
        System.out.println("parent...");
    }
}
class Child2 extends Parent2 {

    Child2() {
    	super("zhangsan");
        System.out.println("child...");
    }
}

如果父类提供构造方法,那么JVM不会提供默认的构造方法,那么子类应该显示调用super方法构建父类对象。

你可能感兴趣的:(java,java,开发语言)