Java类继承

想要扩展一个类的功能,我们可以再这个类中加入其他类以利用这些类的功能,这个方法叫做合成。此外,还可以用类继承来扩展功能。

1. 基本语法:extends

class Animal {
	String name;
	public Animal() {
		System.out.println("This is an animal.");
	}
}

class TerrestrialAnimal extends Animal {
	public TerrestrialAnimal() {
		System.out.println("This is a terrestrial animal.");
	}
}

class Dog extends TerrestrialAnimal {
	public Dog() {
		System.out.println("This is a dog.");
	}

<span style="white-space:pre">	</span>public static void main(String args[]) {
<span style="white-space:pre">		</span>Dog dog = new Dog();
<span style="white-space:pre">	</span>}
}

2. 父类初始化

继承体系中涉及父类和子类概念,被继承类为父类,继承类为子类。上例中Animal是TerrestrialAnimal的父类,而TerrestrialAnimal是Dog的父类,相应的Dog是TerrestrialAnimal的子类,TerrestrialAnimal是Animal的子类。

创建一个子类对象时,其中也包含了一个父类对象,从外部看,父类对象是被封装到子类对象中的。子类和父类对象都需要初始化,我们通过构造方法执行。初始化的顺序是从父类到子类,先跑父类的构造方法初始化父类,然后再初始化子类。上面例子的结果如下:

This is an animal.
This is a terrestrial animal.
This is a dog.

3. 有参数的构造方法

对有默认构造方法(不含任何参数)的类,Java可以自动调用这些构造方法初始化父类(无需在代码中指定),但如果想调用包含参数的构造方法,就需要用super关键字明确调用。

class Animal {
	String name;
	public Animal(String name) {
		this.name = name;
		System.out.println("This is an animal.");
	}
}

class TerrestrialAnimal extends Animal {
	public TerrestrialAnimal(String name) {
		super(name);
		System.out.println("This is a terrestrial animal.");
	}
}

class Dog extends TerrestrialAnimal {
	public Dog(String name) {
		super(name);
		System.out.println("This is a dog.");
	}
	
	public static void main(String args[]) {
		Dog dog = new Dog("Fuifui");
	}
}


4. 用合成还是继承

联系现实世界的例子,属于关系用继承,包含关系用合成。

比如手机与iPhone,是属于关系,iPhone是手机的一种,他们之间可以用继承关系

而iPhone包含很多配件:显示屏,摄像头,话筒。。。,这些配件和iPhone之间是包含关系,应该用合成


5. 上溯造型(Upcasting)
下例中,Animal定义了method eat,eat接受Animal对象句柄为参数,但是在main方法中我们传入的是Dog对象句柄,这种将子类对象句柄转换成父类对象句柄的方法叫上溯造型(Upcasting)。上溯造型肯定是安全的,因为子类继承了父类的所有成员,eat方法中用到得Animal的所有东西,dog都有。

class Animal {
	String name;
	public Animal(String name) {
		this.name = name;
		System.out.println("This is an animal.");
	}
	
	public static void eat(Animal animal) {
		System.out.println(animal.name + " is eating");
	}
}

class TerrestrialAnimal extends Animal {
	public TerrestrialAnimal(String name) {
		super(name);
		System.out.println("This is a terrestrial animal.");
	}
}

class Dog extends TerrestrialAnimal {
	public Dog(String name) {
		super(name);
		System.out.println("This is a dog.");
	}
	
	public static void main(String args[]) {
		Dog dog = new Dog("Fuifui");
		Dog dog2 = new Dog("Guiaguai");
		Animal.eat(dog);
		Animal.eat(dog2);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值