虽然从本质上来讲继承可以对父类操作进行共享,但是从另外一个角度来说,继承本身也是存在有一些限制的。
1.子类对象在进行实例化前一定会首先实例化父类对象,默认调用父类的构造方法后,再调用子类构造方法进行子类对象实例化(必须现有父再有子)
class Person{
public Person() {
System.out.println("****Person类对象创建****");
}
}
class Student extends Person{//定义了一个子类
public Student() {
System.out.println("****Student类对象创建****");
}
}
public class TestDemo{
public static void main(String args[]) {
new Student();//进行子类对象实例化
}
}
****Person类对象创建****
***Student类对象创建****
发现没有任何一条语句会明确调用父类构造,但是父类的构造依然被执行了,
所以就证明子类对象的实例化一定会同时实例化其父类对象
但是需要注意的是,实际上这个时候在子类的构造方法之中相当于隐含了一个语句“super()。”(这是父类有提供无参构造的情况下)
class Person{
public Person() {
System.out.println("****Person类对象创建****");}
}
class Student extends Person{//定义了一个子类
public Student() {
//既然是要进行构造方法声明,那么构造方法的调用一定要放在构造方法的首航
super();//此语句在无参时写于不屑一样
System.out.println("****Student类对象创建****");
}
}
public class TestDemo{
public static void main(String args[]) {
new Student();//进行子类对象实例化
}
}
但是同时需要注意的是,如果此时你的父类没有提供有无参构造,
那么这个时候就必须使用super()明确指明你要调用的父类构造方法
正确代码如下:
class Person{
public Person(String name,int age) {
System.out.println("****Person类对象创建****"); }}
class Student extends Person{//定义了一个子类
public Student(string name,int age,String school) {
//既然是要进行构造方法声明,那么构造方法的调用一定要放在构造方法的首航
★ super(name,age);//此语句在无参时写于不写一样,有参时必须要写来明确定义要调用的父类构造
System.out.println("****Student类对象创建****");
}}
public class TestDemo{
public static void main(String args[]) {
new Student("老婆",20,“清华”);//进行子类对象实例化
}
}
构造方法调用的时候要留有出口
2.java中只允许单继承,不允许多继承;
一个子类只能够继承一个父类;
范例:错误的多继承
class A{}
class B{}
class C extends A,B{}
实际上这个时候C类要同时继承A和B类的操作,所以为了实现这样的概念可以采用多层继承的形式完成。
范例:多层继承
class A{}
class B extends A{}
class C extends B{}
但是这个层不建议太多。一般我们自己在建立类的时候,这些类的关系也就最多是三层结构。
总结:java不允许多重,但是允许多层继承
3.在进行继承的时候,子类会继承父类的所有结构。(私有属性,构造方法,普通方法)。但是这个时候需要注意的是,所有的非私有操作属于显式继承(可以直接调用公有的),而所有的私有操作属于隐式继承(通过其它形式调用,例如:setter、getter)。
观察如下代码的变化
一个简单的继承代码,
class Person{
private String name;
public void setName(String name) {
this.name=name;
}
public String getName() {
return this.name;
}
}
class Student extends Person{
}
public class TestDemo{
public static void main(String args[]) {
Student stu=new Student();
stu.setName("嘻嘻");
System.out.println(stu.getName());
}
}
setName和getName都是非私有方法
而name是封装的
当在子类中定义个方法。在方法中直接输出name
此时父类中的属性的确被子类所继承了,但是子类能够使用的只是所有非private操作(public),而却又的private操作肯定无法直接使用,所以称为隐式继承。
三。1.继承的语法以及继承的目的(扩展已有类的功能,使代码重用);
2.子类对象的实例化流程:不管如何操作一定要先实例化父类对象,然后再实例化子类对象。
3.继承的限制,不允许多重继承,志云寻多层基层