java的继承性


本文选自尚硅谷

java继承性用法

  • 继承性的用法为class A extends B{},其中A为子类,B为父类
  • 继承性的优点是能够减小代码的冗余
  • 子类能够继承父类的属性和方法,但是不能继承父类属性的初始化值

代码如下,先创建一个Person类

package com.atguigu.java;

public class Person {
	String name;
	int age;
	
	public Person(){
		
	}
	
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
		System.out.println("eat");
	}
	
	public void sleep(){
		System.out.println("sleep");
	}
}

然后创建一个Studeng类

package com.atguigu.java;

public class Student extends Person{
//	String name;
//	int age;
	String major;
	
	public Student(){
		
	}
	
	public Student(String name,int age,String major){
		this.name = name;
		this.age = age;
		this.major = major;
	}
	
//	public void eat(){
//		System.out.println("eat");
//	}
//	
//	public void sleep(){
//		System.out.println("sleep");
//	}
//	
	public void study(){
		System.out.println("study");
	}
}

在Student类中,所有加上注释的都是可以省略掉的部分,因为Student类继承了Person类,故也拥有了Person类的全部属性和方法,就不必自己再敲一遍和Person类同样的代码了。
测试代码如下,创建一个ExtendsTest类

package com.atguigu.java;

public class ExtendsTest {
	public static void main(String[] args) {
		Person p1 = new Person("xiaoxiao",12);
		p1.eat();
		p1.age = 18;
		
		Student s1 = new Student();
		s1.eat();
		System.out.println(s1.name+" "+s1.age);
		s1.name = "xiaoming";
		System.out.println(s1.name);
				
	}
}

运行结果为:

eat
eat
null 0
xiaoming

可以看出,在 Student类中没有定义eat()方法,但由于Student类继承了父类的eat()方法,因此也有了eat()方法。且在父类给属性初始化的值,是无法传递到子类的。

继承性与封装性的交互

假如将Person类中的age设为private,把sleep方法也设为private,子类在继承父类的时候,其实仍然继承了父类私有的方法和属性,只不过不能够在子类中直接调用父类的私有方法和属性了,因为封装性的影响,必须通过父类提供的外部接口调用父类的私有属性和方法,换句话说,把父类私有属性和方法放到父类的公用方法中,通过调用父类的公用方法从而获取父类的私有属性和方法。
代码如下

package com.atguigu.java;

public class Person {
	String name;
	private int age;
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Person(){
		
	}
	
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
		System.out.println("eat");
		sleep();
	}
	
	private void sleep(){
		System.out.println("sleep");
	}
}

把Person类的age属性设为私有,就得设置getAge和setAge的公用方法,把sleep方法设为私有,就把sleep方法放入公有的eat方法内部,同样可以用sleep方法。

package com.atguigu.java;

public class Student extends Person{
//	String name;
//	int age;
	String major;
	
	public Student(){
		
	}
	
	public Student(String name,int age,String major){
		this.name = name;
//		this.age = age;
		setAge(age);
		this.major = major;
	}
	
	public void study(){
		System.out.println("study");
	}
	
	public void show(){
		System.out.println("name = "+name+",age = "+ getAge()+"major = "+major);
	}
}

Student类是子类,也要有相应的更改,不能直接调用私有属性了,必须通过父类的公用方法调用。

package com.atguigu.java;

public class ExtendsTest {
	public static void main(String[] args) {
		
		Student s1 = new Student("xiaoming",18,"automation");
		s1.eat();
//		s1.sleep();
		s1.show();	
	}
}

运行结果如下

eat
sleep
name = xiaoming,age = 18major = automation

父类的私有属性和方法都被调用了,可见继承性是可以继承父类的私有属性和方法的,只不过受封装性的影响,必须通过父类的公用方法来调用。

继承性的特征

  • 一个子类只能有一个父类
  • 一个父类可以派生多个子类
  • 假如说有A,B,C,D四个类,A继承于B,B继承于C,C继承于D,则B是A的直接父类,C和D是A的间接父类
  • 在类的定义那一行语句按住ctrl+t能够看间类的继承目录,所有类(出了object类本身)都继承于java.lang.Object类,也能使用Object类的方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值