public class DemoMain {
public static void main(String[] args) {
//对象的向上转型,就是:父类引用指向子类对象。
Animal animal = new Cat();
animal.eat();
}
}
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
2.对象的向下转型
向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端: 对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。 解决方案:用对象的向下转型[还原]
public class DemoMain {
public static void main(String[] args) {
//对象的向上转型,就是:父类引用指向子类对象。
Animal animal = new Cat();//本来创建的时候是一只猫
animal.eat();
//animal.cathcMouse();//错误写法
Cat cat = (Cat) animal;
cat.catchMouse();
}
}
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
//子类特有方法
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃shit");
}
public void watchHouse(){
System.out.println("狗用来看家");
}
//下面是错误的向下转型
//本来new的时候是一只猫,现在非要当做狗
//Dog dog = (Dog) Animal;//错误写法
}
如何才能知道一个父类引用的对象,本来是什吗子类?
格式:
对象 instanceof 类
这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
public class Demo2Instanceof {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
//如果希望调用子类特有方法,需要向下转型
//判断一下父类引用animal本来是不是Dog
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.eat();
}
//判断一下animal本来是不是Cat
if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.catchMouse();
}
giveMeAPeat(new Dog());
}
public static void giveMeAPeat(Animal animal){
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.eat();
}
//判断一下animal本来是不是Cat
if(animal instanceof Cat){
Cat cat = (Cat) animal;
cat.catchMouse();
}
}
}
3.usb接口例子
public interface USB {
public abstract void open();//打开设备
public abstract void close();//关闭设备
}
public class Computer {
public void powerOn(){
System.out.println("笔记本电脑开机");
}
public void powerOff(){
System.out.println("笔记本电脑关机");
}
//使用USB设备的方法,使用接口作为方法参数
public void usbDevice(USB usb){
usb.open();//打开设备
if( usb instanceof Mouse){//先判断
Mouse mouse = (Mouse) usb;//向下转型
mouse.Click();
}else if(usb instanceof Keyboard){//先判断
Keyboard keyboard = (Keyboard) usb;//向下转型
keyboard.type();
}
usb.close();//关闭设备
}
}
//鼠标就是一个USB设备
public class Mouse implements USB{
@Override
public void open() {
System.out.println("打开鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
public void Click(){
System.out.println("鼠标点击");
}
}
//键盘就是一个USB设备
public class Keyboard implements USB{
@Override
public void open() {
System.out.println("打开键盘");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
public void type(){
System.out.println("键盘输入");
}
}
public class DemoMain {
public static void main(String[] args) {
Computer computer = new Computer();
//首先创建一个笔记本电脑
computer.powerOn();
//准备一个鼠标,供电脑使用
// Mouse mouse = new Mouse();
//首先先进行向上转型
USB usbMouse = new Mouse();//多态写法
//参数是USB类型,我正好传递进去的就是usb鼠标
computer.usbDevice(usbMouse);
//创建一个USB键盘
Keyboard keyboard = new Keyboard();//没有使用多态写法
//方法参数是usb类型,传递进去的就是实现类对象
computer.usbDevice(keyboard);//正确写法,也发生了向上转型
//使用子类对象,匿名对象,也可以
//computer.usbDevice(new Keyboard());//也是正确写法
computer.powerOff();
System.out.println("=========================");
method(10.0);
method(10);
int a ;
a = 20;
method(a);
}
public static void method(double num) {
System.out.println(num);
}
}