java继承
- 继承的基本概念
- super、this
- 构造方法
继承的基本概念
面向对象中有3个重要的特征:继承、封装、多态。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
一个类只能有一个父类,不能存在多个父类;但一个父类可以有多个子类。
生活中的继承:
继承采用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);}
}
可以看到结果: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);}
}
构造方法
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...");}
}
可以看到结果,父类对象也创建了三次。
所以从类的角度来讲,不同的子类确实有相同的父类。
但从对象的角度来说,一个子类对象对应一个父类的对象,这些父类对象的名字相同而已。其实,准确来说,没有父类对象这个概念,不过是子类继承到父类的属性和方法,然后开辟的一块内存空间。
父类对象是在子类对象创建前创建完成,创建子类对象前,会调用父类的构造方法完成父类的创建。
默认情况下,子类对象构建时,会默认调用父类的构造方法完成父类对象的创建。使用的是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方法构建父类对象。