java学习笔记(十四)多态、对象转型

目录

1.多态

1.类的多态

2.接口的多态

2.对象转型

1.向上转型:

2.向下转型

1.多态

1.类的多态

我们来简单实现一个需求,老师骑着自行车上班,这时候我们就需要建一个人物类,自行车类,然后分别在实体类里面写上方法,一般我们的思想就是这样,但是假如我需求升级,现在老师是做小轿车去上班,好,这时候我们需变动我们创建的自行车类,然后再写方法和属性,但是就需要修改原来的代码,我们在写代码的时候其实默认都遵守一个规则,叫ocp原则(开闭原则),O- open,在需求升级的时候,对于创建类是欢迎的,C-close,在需求升级时,对于修改原有类时拒绝的,针对这个原则,我们是可以使用多态来写。

我们把小车和自行车相同的元素提取出来,创建为一个交通工具抽象类,然后我的小车类和自行车类来继承我的父类,然后在我的子类中重写我需要的方法,就可以达到我无论变成什么交通工具,都不用修改原来的代码。

主方法:

public class Test01 {

	public static void main(String[] args) {
		
		Teacher t = new Teacher();
		
		//多态:子类对象执行父类引用
		//父类引用中存的是子类对象在堆中开辟的地址
		Vehicle v = new Car();
		
		t.start(v);
		System.out.println("欣赏沿途的风景...");
		t.stop(v);
		
	}
}

老师类:

public class Teacher {

	public void start(Vehicle v){
		v.open();
	}
	
	public void stop(Vehicle v){
		v.close();
	}
}

交通工具类:

public abstract class Vehicle {

	public abstract void open();
	
	public abstract void close();
}

自行车类: 

public class Bike extends Vehicle{

	@Override
	public void open(){
		System.out.println("握好把手,脚蹬脚踏板");
	}
	
	@Override
	public void close(){
		System.out.println("手捏刹车");
	}
}

小车类:

public class Car extends Vehicle{

	@Override
	public void open(){
		System.out.println("系好安全带,一键启动,挂挡,踩油门");
	}
	
	@Override
	public void close(){
		System.out.println("踩刹车,挂挡,熄火,松安全带");
	}
}

2.接口的多态

需求,模拟电脑连接外部设备

首先我们思考一下,这些外部设备有什么相同点,对,就是都需要插在电脑上才能用,所以我们创建一个usb接口类

public interface IUSB {
	
	public void use();

}

键盘类去实现usb接口类

public class Keyboard implements IUSB {

	@Override
	public void use() {
		System.out.println("键盘:输入数据");
	}

}

鼠标类实现usb接口类

public class Mouse implements IUSB{

	@Override
	public void use() {
		System.out.println("鼠标:左点点、右点点");
	}

}

主方法:

public class Test01 {

	public static void main(String[] args) {
		
		Computer computer = new Computer();
		
		//接口的多态:实现类对象指向接口的引用
		//接口的引用存储的是实现类对象在堆中开辟的地址
		IUSB usb = new Keyboard();
		
		computer.connection(usb);
	}
}

2.对象转型

1.向上转型:

子类类型 转 父类类型
         * 可以调用父类的非私有化成员变量
         * 可以调用父类的非私有化的成员方法
         * 可以调用子类重写父类的成员方法

向上转型其实就是多态
         * 多态的优点:符合OCP原则的开发,需求更改时,项目的可维护性高
         * 多态的缺点:不能调用子类独有的成员变量和成员方法

2.向下转型

父类类型转子类类型

注意:

* 首先我们要先向上转型之后,才能向下转型

* 向下转型是不安全的

比如 

import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {
		
		//错误示范
		//ClassCastException - 类型转换异常
		Scanner scan = (Scanner) new Object();
	}
}

这个时候就会报类型转换异常,就是不安全的,所以我们在用的时候一定要用instanceof来判断,否则就可能会报错。

比如我们建一个动物类:

//动物类
public class Animal {

}

然后写一个小猫类继承动物类:

public class Cat extends Animal{

	public void shout(){
		System.out.println("小猫:喵喵喵~~~");
	}
}

写个小狗继承动物类:

public class Dog extends Animal{

	public void eat(){
		System.out.println("小狗吃骨头~~");
	}
}

主方法:

public class Test02 {

	public static void main(String[] args) {
		
		//向上转型
		Animal an = new Cat();
		
		//向下转型
		if(an instanceof Dog){//判断引用an中存储的对象是否是Dog类
			Dog dog = (Dog) an;
			dog.eat();
		}else if(an instanceof Cat){//判断引用an中存储的对象是否是Cat类
			Cat cat = (Cat) an;
			cat.shout();
		}
		
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyyiwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值