Java暑期学习Day20
本帖最后由 马太效应 于 2017-7-24 22:04 编辑今天是第20天,论注意身体的重要性{:10_269:} {:10_266:}{:10_266:},今天就把昨天写了又被卡掉的补上,再整理下之前敲的代码好了T T
static/image/hrline/4.gif
①对象上下转型
1.向上转型:由子类转型为父类(继承图上向上移动),不需要强制转换,总是安全的。
<可能丢失方法,不会获取方法>
2.向下转型:与向上转型相反,不安全,需要强制转换。
(可能需要instanceof操作符协助)
语法:boolean result=object instanceof class 。
运算符instanceof通过返回一个boolean类型的值,用来判断Obect 是否是class类型的。
3.LSP(liskov替换原则):子类型必须能够替换掉它们的基类型
4.在敲代码时的发现:
如果父类定义了一个有参的构造器,那么子类也要定义一个有参的构造器,且要在第一行书写super(...);
如果父类既定义了有参的构造器,也定义了无参的构造器,那么子类会默认调用父类的无参构造器,意思就是不用自己再定义有参的构造器。
如果父类没有定义构造器,那父类和子类调用的都是系统默认的无参构造器。
5.辅助理解代码
package ploymorphism;
public class AnimalDemo {
public static void main(String[] args) {
//父类的引用变量可以引用其子类对象
Animal ani1= new Dog("旺旺"); //向上转型
//向上转型是安全的,但可能会导致子类方法的丢失
//父类的引用变量只能调用父类中有的方法或子类重写的方法
ani1.eat();
//ani1.sleep(); The method sleep() is undefined for the type Animal
Animal ani2 = new Cat("招福猫");
ani2.eat();
//向下转型是不安全的
//Cat cat=(Cat)ani1; java.lang.ClassCastException
if (ani2 instanceof Cat){
System.out.println("注意身体");
Cat cat=(Cat)ani2;
cat.sleep();
}
}
}
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
// 这是一个通用方法,由子类去实现
public void eat() {
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
// 对父类的方法进行重写
public void eat() {
System.out.println("爱吃骨头的汪");
}
public void sleep() {
System.out.println("爱睡懒觉的汪");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
// 对父类的方法进行重写
public void eat() {
System.out.println("爱吃罐头的喵");
}
public void sleep() {
System.out.println("爱睡懒觉的猫唔");
}
}
结果是——
爱吃骨头的汪
爱吃罐头的喵
注意身体
爱睡懒觉的猫唔
页:
[1]