JAVASE进阶day02(多态,抽象类,接口)
多态#
1.为什么要使用:#
避免太多相似代码,减少代码重复,屏蔽不同子类的差异性,从而可以使用同一个方法达到不同的效果。
2.定义:#
就是同一个对象在不同情况下展现的不同形态
3.如何展现多态:#
继承和实现,方法重写,有父类引用指向子类对象
多态的两种形式展现,创建对象指向父类和重写方法
4.多态中成员变量和方法的访问特点:#
成员变量没有多态,成员方法编译看左边运行看右边。
5.多态优缺点#
好处:提高了程序扩展性,缺点:不能使用子类的特有功能(类型转换可以解决)
6.多态转型#
父子类型的相互转换:
子转父:向上转型,
父转子:向下转型(向下转型一定要转换成真实类型)搭配instanceof来实现类型转换安全检查
为什么要转型?为了使用子类的特有功能。
7.多态在工作中的应用场景#
在工作中一般使用在方法中,父类作为方法中的形参,子类可以传递进来
package com.lu.day02.test2;
public class Hero {//英雄类
private String name;
public Hero(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void attack(Hero hero){//攻击
System.out.println(hero.getName()+"被杀死了");
}
}
package com.lu.day02.test2;
public class WillDeep extends Hero{//剑圣
public WillDeep(String name) {
super(name);
}
@Override
public void attack(Hero hero) {
System.out.println("剑圣击杀了"+hero.getName());
}
}
package com.lu.day02.test2;
public class Widow extends Hero{//寡妇
public Widow(String name) {
super(name);
}//寡妇类
@Override
public void attack(Hero hero) {
System.out.println("寡妇击杀了"+hero.getName());
}
}
package com.lu.day02.test2;
import java.awt.*;
public class Test {
public static void main(String[] args) {
Widow widow = new Widow("寡妇");
Mantis mantis = new Mantis("螳螂");
KnifeGirl knifeGirl = new KnifeGirl("刀妹");
WillDeep willDeep = new WillDeep("剑圣");
willDeep.attack(widow);
willDeep.attack(mantis);
willDeep.attack(knifeGirl);
}
}
抽象类#
1.为什么要使用#
面向对象中,对象都是通过类来描绘的,反过来,并不是所有的类都是用来描绘对象的,这样的类就是抽象类。
2.概述#
用abstract关键字修饰一个类就是抽象类. 可以看成是对普通类的进一步抽象
抽象方法:没有方法体的方法
3.特点#
1.可以定义具体方法
2.可以没有抽象方法
3.有抽象方法的类一定是抽象类
4.抽象类不能实例化,只能通过子类实例化
5.虽然不能实例化,但是可以有构造方法,主要用于数据初始化
6.抽象类的子类必须重写抽象父类中的所有抽象方法
4.练习题#
1)定义一个水果类Fruit 1)水果类中包含水果的名称,产地,价钱
2)水果类中有开花,结果,被采摘行为.
3)现有红富士苹果,产自山东烟台,价钱20元/斤
4)定义水果工具类(FruitUtil),其中有一静态方法用来专门给买水果的人称重量算钱,(提示:方法参数应该有买的重量以及水果类型)
package com.lu.day02.Test3;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Apple fruit = new Apple();
fruit.setName("红富士山苹果");
fruit.setOrigin("山东烟台");
fruit.setPrice(20);
System.out.println(fruit);
System.out.println("请问你要买几斤");
Scanner scanner = new Scanner(System.in);
System.out.println(FruitUtil.calculateThePrice(fruit, scanner.nextDouble()));
}
}
package com.lu.day02.Test3;
public class FruitUtil {
private FruitUtil(){}
public static double calculateThePrice(Apple apple,double b){//计算价格
return apple.getPrice() * b;
}
}
package com.lu.day02.Test3;
public abstract class Fruit {//水果
private String name;
private String origin;//产地
private double price;//价钱
public Fruit() {
}
public Fruit(String name, String origin, double price) {
this.name = name;
this.origin = origin;
this.price = price;
}
public abstract void flowersBloom();
public abstract void outcome();
public abstract void pluck();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + '\'' +
", origin='" + origin + '\'' +
", price=" + price +
'}';
}
}
package com.lu.day02.Test3;
public class Apple extends Fruit{
@Override
public void flowersBloom() {
System.out.println(getName()+"开花");
}
@Override
public void outcome() {
System.out.println(getName()+"结果");
}
@Override
public void pluck() {
System.out.println(getName()+"采摘");
}
}
接口#
1.为什么要用#
为了解决单继承的缺点
2.概述#
1.接口提供一种公共的规范,是为了在符合规范的前提下,达到通用的目的。(定义行为规范)
2.java中的接口使用interface定义,是一种对行为的抽象
3.特点#
1.接口中主要使用抽象方法,不能有普通方法
2.子类实现接口使用implements,而非extends
3.接口不能直接实例化,可以通过其子类实例化
4.子类如果实现接口,必须实现接口中所有方法
5.子类可以实现多个接口
6.接口中的成员变量都被final以及public以及static隐式修饰,即都为常量
7.接口中可以定义默认方法(java8新增)、静态方法(java8)、私有方法(java9新增)
8.接口中没有构造方法
子类默认要访问父类构造方法,如果接口没有构造方法那访问的是什么呢
4.类和接口的关系#
1.类和类
如果符合继承的使用原则,则存在继承关系
2.类和接口
用implements
3.接口和接口
用extends,多继承
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix