这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/115741531
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
多态
多态的格式与使用
-
代码当中体现多态性,其实就一句话,父类引用子类对象
-
格式
父类名称 对象名 = new 子类名称();
或者
接口名称 对象名 = new 实现类名称();
演示
- 其他类
package com.idayuanshuai.www.Demo1;
public class FatherDemo {
public void method(){
System.out.println("这是父类方法");
}
public void methodFa(){
System.out.println("这是父类特有的方法");
}
}
package com.idayuanshuai.www.Demo1;
public class SonDemo extends FatherDemo{
@Override
public void method() {
System.out.println("这是子类的方法");
}
}
- 主类
package com.idayuanshuai.www.Demo1;
public class TestDemo {
public static void main(String[] args) {
FatherDemo son = new SonDemo();
son.method();
son.methodFa();
}
}
- 结果输出
这是子类的方法
这是父类特有的方法
多态当中成员变量的使用特点
- 访问成员变量的两种方式
- 直接通过对象名称访问成员变量,看等号左边是谁,就优先用谁,没有则向上查找
- 间接通过成员方法访问成员变量,看该方法属于谁,就优先用谁,没有则向上查找
演示
- 其他类
package com.idayuanshuai.www.Demo2;
public class FatherDemo1 {
int num = 10;
int age = 100;
public int showAge(){
System.out.println(this.age);
return this.age;
}
public int showNum(){
System.out.println(this.num);
return this.num;
}
}
package com.idayuanshuai.www.Demo2;
public class SonDemo1 extends FatherDemo1{
int num = 20;
int age = 200;
@Override
public int showNum() {
System.out.println(this.num);
return this.num;
}
}
- 主类
package com.idayuanshuai.www.Demo2;
public class ClassMutiFileid {
public static void main(String[] args) {
FatherDemo1 f = new SonDemo1();
System.out.println(f.num);
f.showAge();
f.showNum();
}
}
- 输出结果
10
100
20
成员方法使用特点
-
在多态的代码当中,成员方法的访问规则是:
- 看
new的是谁,就优先用谁,没有则向下找
- 口诀:编译看左边,运行看右边
- 看
-
对比之下:成员变量的访问规则为
- 编译看左边,运行看左边
演示
- 其他类
package com.idayuanshuai.www.Demo3;
public class FatherDemo1 {
public void methodFa(){
System.out.println("这是父类的方法");
}
public void methodCommon(){
System.out.println("这是相同的方法");
}
}
package com.idayuanshuai.www.Demo3;
public class SonDemo extends FatherDemo1 {
@Override
public void methodCommon() {
System.out.println("这是子类自己的相同方法");
}
public void methodSon(){
System.out.println("这是子类特有的方法");
}
}
- 主类
package com.idayuanshuai.www.Demo3;
public class TestDemo {
public static void main(String[] args) {
FatherDemo1 fa = new SonDemo();
// fa.methodSon() 这条语句如果编译的话,不会通过,因为父类没有methodSon()方法,只有子类采用这个方法。所以会报错
fa.methodCommon();
fa.methodFa();
}
}
- 输出结果
这是子类自己的相同方法
这是父类的方法
向上转型与向下转型
- 对象的向上转型,其实就是多态的写法
- 格式:
父类 对象名 = new 子类对象
- 向上转型一定是安全的,正确的。
- 对象的向下转型,其实就是一个【还原】动作
- 格式:子类对象 对象名 = (子类名称)父类对象
演示
- 其他类
package com.idayuanshuai.www.Demo4;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
package com.idayuanshuai.www.Demo4;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catchWoods(){
System.out.println("爬树");
}
}
- 主类
package com.idayuanshuai.www.Demo4;
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
Cat cat = new Cat();
cat.catchWoods();
cat.eat();
}
}
- 输出结果
猫吃鱼
爬树
猫吃鱼
instanceof 关键字
instanceof
关键字可以判断父类引用的对象,原来是什么子类
演示
- 其他类
package com.idayuanshuai.www.Demo4;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
package com.idayuanshuai.www.Demo4;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catchWoods(){
System.out.println("猫爬树");
}
}
package com.idayuanshuai.www.Demo4;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void run(){
System.out.println("狗跑跑跑");
}
}
package com.idayuanshuai.www.Demo4;
public class UsePlay {
public static void play(Animal animal){
if(animal instanceof Dog){
Dog dog = new Dog();
dog.run();
}
if (animal instanceof Cat){
Cat cat = new Cat();
cat.catchWoods();
}
}
}
- 主类
package com.idayuanshuai.www.Demo4;
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Cat();
UsePlay.play(animal);
Animal animal1 = new Dog();
UsePlay.play(animal1);
}
}
- 输出结果
猫爬树
狗跑跑跑
例题
- 有两个
USB
类型的设备:鼠标和键盘 - 电脑只有一个
USB
接口 - 要求使用一个方法完成对多个设备的操作,要求完成
USB
的插拔,和操作
提示:用到单例模式、同时还有多态思想
- 接口
package com.idayuanshuai.www.Demo5;
public interface Device {
public abstract void click();
public abstract void off();
public abstract void on();
}
- 接口实现类
package com.idayuanshuai.www.Demo5;
public class Mouse implements Device {
@Override
public void click(){
System.out.println("鼠标点击");
}
@Override
public void on(){
System.out.println("插入鼠标");
}
@Override
public void off(){
System.out.println("拔掉鼠标");
}
}
package com.idayuanshuai.www.Demo5;
public class Keyboard implements Device {
@Override
public void click(){
System.out.println("键盘敲击");
}
@Override
public void off() {
System.out.println("键盘打开");
}
@Override
public void on() {
System.out.println("键盘关闭");
}
}
- 操作实现类
package com.idayuanshuai.www.Demo5;
public class PlayDevice {
private static int num = 0;
private static int typeNum = 0;
public static void clik(Device device){
if( num == 1){
if(device instanceof Mouse && typeNum == 0){
Mouse mouse = new Mouse();
mouse.click();
}
else if(device instanceof Keyboard && typeNum == 1){
Keyboard keyboard =new Keyboard();
keyboard.click();
}
else{
System.out.println("您所选择的操作设备不符合要求");
}
}else{
System.out.println("您所选择的设备未插入,请把设备插入后,再操作");
}
}
public static void on(Device device){
if(num == 0){
if (device instanceof Mouse){
Mouse mouse = new Mouse();
mouse.on();
num++;
typeNum = 0;
}
if(device instanceof Keyboard){
Keyboard keyboard = new Keyboard();
keyboard.on();
num++;
typeNum = 1;
}}else{
System.out.println("USB 接口不足");
}
}
public static void off(Device device){
if ( num == 1) {
if (device instanceof Mouse) {
Mouse mouse = new Mouse();
mouse.off();
num--;
}
if (device instanceof Keyboard) {
Keyboard keyboard = new Keyboard();
keyboard.off();
num--;
}
}else{
System.out.println("usb 接口已经为空");
}
}
}
- 主类
package com.idayuanshuai.www.Demo5;
public class PlayClass {
public static void main(String[] args) {
Device mouse = new Mouse();
Device keyboard = new Keyboard();
PlayDevice.on(mouse);
PlayDevice.clik(keyboard);
PlayDevice.clik(mouse);
PlayDevice.on(keyboard);
PlayDevice.on(mouse);
PlayDevice.off(mouse);
PlayDevice.on(keyboard);
PlayDevice.on(mouse);
PlayDevice.clik(mouse);
PlayDevice.clik(keyboard);
PlayDevice.off(keyboard);
}
}
- 输出结果
插入鼠标
您所选择的操作设备不符合要求
鼠标点击
USB 接口不足
USB 接口不足
拔掉鼠标
键盘打开
USB 接口不足
您所选择的操作设备不符合要求
键盘敲击
键盘关闭
写在最后的话:
- 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
- 欢迎关注我的CSDN博客,IDYS’BLOG
- 持续更新内容:
linux基础 | 数据通信(路由交换,WLAN) | Python全栈 | 云计算 - 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
- 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!