Java学习的第十五天(JavaSE精英篇05_多态)

2023-11-10 12:20

本文主要是介绍Java学习的第十五天(JavaSE精英篇05_多态),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、多态:同种事物不同的表现形式

实现多态的三个前提:1.要实现子父类继承关系(通过类实现一个接口),2.要有方法的重写,3.父类引用指向子类对象

package com.bianyiit.cast;public class Demo1 {//多态:实现的三个前提//1.要实现子父类继承关系(通过类实现一个接口)//2.要有方法的重写//3.父类引用指向子类对象public static void main(String[] args) {//new Animal().eat();Animal a1 = new Dog();  //new Dog-->子类对象   Animal a1-->父类引用a1.eat();}
}
//定义一个动物类
class Animal{//成员方法public void eat(){System.out.println("吃东西..");}
}
class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃泥..");}
}
二、多态中成员的特点(变量、方法和静态方法)

1.动态绑定:在运行的时候会指向具体的对象
2.编译期(没点击运行之前,如果出现红线表明编译时出错)和运行期(点击运行时,正常运行还是报错)

package com.bianyiit.cast;public class Demo2 {public static void main(String[] args) {//System.out.println(new Dog2().color);Animal2 a1 = new Dog2();System.out.println(a1.color);a1.eat();a1.sleep();}
}
class Animal2{//定义一个成员变量String color="白色";public void eat(){System.out.println("我是一只动物..");}public static void sleep(){System.out.println("动物正在睡觉..");}
}
class Dog2 extends Animal2{String color="黑色";@Overridepublic void eat() {System.out.println("狗啃泥..");}//@Overridepublic static void sleep() {System.out.println("狗正在睡觉..");}
}
1.成员变量:编译期,如果父类里面没有成员变量就会报错,如果子类里面没有成员变量没问题运行期,运行出来的结果显示的是父类的成员变量的值
2.成员方法:编译期,如果父类里面没有成员方法就会报错,如果子类里面没有成员方法没问题运行期,运行出来的结果显示的是子类的成员方法的内容
3.静态方法:编译期,如果父类里面没有静态方法就会报错,如果子类里面没有静态方法没问题运行期,运行出来的结果显示的是父类的静态方法的内容
总结:使用多态应用的时候,成员变量  成员方法 静态方法编译期看的都是父类(父类中有这个东西才能够使用)*   运行时只有成员方法看的是子类的具体对象(调用的是子类的方法----动态绑定)*   注意:多态有一个局限性:无法调用子类特有的成员
三、如果想去调用子类特有的成员该怎么办?
调用子类特有的成员:数据类型的转换:基本数据类型的转换自动转换 (由小转大)byte  shor  char-->int-->long-->float-->double   boolean不参与任何数据的转换强制转换(由大转小---会损失精度)引用数据类型的转换:向上转型(小的转大的)向下转型(大的转小的)
package com.bianyiit.cast;public class Demo3 {public static void main(String[] args) {Animal3 a1 = new Dog3();//(向上转型---小的自动转大的)  狗自动转换成动物a1.eat();//动态绑定---调用的是子类的方法Dog3 d1=(Dog3)a1;  //向下转型(大的转小的)   动物强制转换成狗d1.eat();d1.sleep();//转型之后调用(子类)狗里面的特有的成员方法}
}
class Animal3{public void eat(){System.out.println("动物");}
}
class Dog3 extends Animal3{@Overridepublic void eat() {System.out.println("狗");}public void sleep(){System.out.println("狗正在睡觉..");}
}
四、多态的优点
package com.bianyiit.cast;public class Demo4 {public static void main(String[] args) {/*  多态的优点:1.继承的优点也就是多态的优点(1.提高了代码的复用性 )  2.提高程序的扩展性。*///以工厂生产手机为例Factory f1 = new Factory();f1.produce(new XiaoMiPhone());f1.produce(new RedNotePhone());}
}
//定义一个工厂用来生产手机
class Factory{public void produce(Phone p){p.run();}
}
class Phone{public void run(){}
}
class XiaoMiPhone extends Phone{@Overridepublic void run() {System.out.println("生产小米手机中..");}
}
class RedNotePhone extends Phone{@Overridepublic void run() {System.out.println("生产红米手机中..");}
}
五、内部类的使用
5.1 成员内部类
package com.bianyiit.cast;public class Demo7_ChengYuanNeiBuNei {public static void main(String[] args) {//创建外部类对象  直接通过外部类的对象调用外部类的成员方法(内部包含内部类的实例化成员)//new Out().run();new Out().new In().study();  //成员方法System.out.println(new Out().new In().num);  //成员变量}
}
//定义一个外部类
class Out{//成员变量int num=10;//成员方法/*public void run(){System.out.println("--调用外部类的成员方法-->然后在该方法中调用内部类的成员");//创建内部类的第一种方式,在外部类的成员方法中创建内部类对象//new In().study();//System.out.println(new In().num);}*///成员内部类(与成员变量处于同一级别)class In{//内部类的成员变量int num=20;//内部类的成员方法public void study(){System.out.println("学习中..");}}
}
5.2 静态内部类
package com.bianyiit.cast;public class Demo8_JinTaiNeiBuNei {//静态内部类 静态内部类里面不能访问非静态成员public static void main(String[] args) {new Animal8.Dog8().sleep();System.out.println(new Animal8.Dog8().num);}
}
class Animal8{static int num=10;static class Dog8{int num=20;public void sleep(){System.out.println("狗正在睡觉..");}}
}
5.3 局部内部类
package com.bianyiit.cast;public class Demo9_JuBuNeiBuNei {public static void main(String[] args) {//因为局部内部类的作用范围只在外部类的成员方法里面,一旦出了这个范围就不能使用了//所以局部内部类的创建只能在外部类的成员方法里面去创建,并且只能在局部内部类的后面才能创建成功!new Out9().printout();}
}
class Out9{//成员变量int num=10;//成员方法public void printout(){System.out.println("这是一个外部类的方法");//局部变量int num=20;//如果在这里创建局部内部类对象,在此之前连类都没有定义出来,所以在编译时就报错了!!//new In9().printin();//局部内部类class In9{//局部内部类的成员变量int num=30;//局部内部类的成员方法public void printin(){System.out.println("这是一个局部内部类");}}//如果在这里创建局部内部类对象并调用方法,可以使用!new In9().printin();System.out.println(new In9().num);}
}
5.4 匿名内部类(这个在多线程中用的很多)
package com.bianyiit.cast;public class Demo10_NiMingNeiBuNei {public static void main(String[] args) {//匿名内部类:用来创建类/接口的子类对象用的Out10 o1= new Out10(){@Overridepublic void Out10() {System.out.println("我是一只猫");}};o1.Out10();//匿名对象+匿名内部类new Out10(){@Overridepublic void Out10() {System.out.println("我是一头有思想的牛");}}.Out10();//多态:父类引用指向子类对象,动态绑定,在运行的时候会指向子类对象,它的会自动调用子类重写的成员方法//这里输出的效果和使用匿名内部类的效果是一致的!Out10 o2=new In10();o2.Out10();/*为什么要使用匿名内部类,减少代码量匿名内部类和通过继承父类创建一个子类,然后调用子类重写的成员方法的效果是一致的*/}
}
class Out10{public void Out10(){System.out.println("我是一只动物!!");}
}
//这里通过new Out10().out10();来使用子类的方法
class In10 extends Out10{@Overridepublic void Out10() {System.out.println("我是一只哈巴狗!");}
}
六、权限修饰符的比较

package com.bianyiit.quanxian.public1;public class Demo {public static void main(String[] args) {printPublic();printDefault();printPrivate();printProtected();}public static void printPublic(){System.out.println("public方法");}static void printDefault(){System.out.println("default方法");}private static void printPrivate(){System.out.println("private方法");}protected static void printProtected(){System.out.println("protected方法");}
}
package com.bianyiit.quanxian.public1;public class Demo1 extends Demo{public static void main(String[] args) {Demo.printPublic();Demo.printDefault();Demo.printProtected();}
}
package com.bianyiit.quanxian.protect;import com.bianyiit.quanxian.public1.Demo;public class Demo2 extends Demo{//在不同的包中,只有继承父类之后才能使用protected修饰的方法,而不能使用default修饰的方法,这是protected和default最大的区别public static void main(String[] args) {Demo.printPublic();Demo.printProtected();}
}
七、多态总结
1.多态:父类的引用指向了子类对象Animal a=new Cat();2.1 多态的优点1.继承的优点也就是多态的优点2.提高程序的扩展性。
2.2 缺点:无法直接访问子类特有的成员。多态就是向上转型。如果想访问子类特有的成员?向下转型3 继承:优缺点3.1 优点:1.提高代码的复用性2.提高程序的可维护性3.2 缺点:类与类之间的关联更加的密切。(耦合性增强)4 如何解决高耦合?  使用接口4.1 封装的优点:1.提高代码的复用性2.提高代码的安全性。
课后作业
package com.bianyiit.zonghe;public class Demo_Phone {public static void main(String[] args) {Factory factory = new Factory();factory.prodece(new XiaoMiPhone());factory.prodece(new RedNotePhone());factory.prodece(new PupperNotePhone());/*factory.run(new XiaoMiPhone());factory.run(new RedNotePhone());factory.run(new PupperNotePhone());*/}
}
//工厂:生产手机
class Factory{/*public void run(XiaoMiPhone x){x.produceXiao();}public void run(RedNotePhone r){r.produceRed();}public void run(PupperNotePhone p){p.producePupper();}*/public void prodece(Phone p){p.run();}//Phone p=new XiaoMiPhone();//p.run();当使用多态创建对象时,当父类和子类使用的是同一个成员方法,那么对象调用的是子类的成员方法
}
abstract class Phone{public abstract void run();
}
//小米手机的生产方法
class XiaoMiPhone extends Phone{@Overridepublic void run() {System.out.println("正在生产小米手机...");}
}
//红米手机的生产方法
class RedNotePhone extends Phone{@Overridepublic void run() {System.out.println("正在生产红米手机...");}
}
//紫米手机的生产方法
class PupperNotePhone extends Phone{@Overridepublic void run() {System.out.println("正在生产紫米手机...");}
}

这篇关于Java学习的第十五天(JavaSE精英篇05_多态)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382625

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2