继承的限制

虽然从本质上来讲继承可以对父类操作进行共享,但是从另外一个角度来说,继承本身也是存在有一些限制的。

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.继承的限制,不允许多重继承,志云寻多层基层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值