五、Java面向对象:多态
一、多态介绍
概述:顾名思义就是事物在某种时刻的多种状态
前提;1、要有继承关系
2、要有方法的重写
3、要有父类的引用指向子类对象
访问成员的特点:
访问成员变量:编译看左,运行看左
访问成员方法:编译看左,运行看右
访问静态成员方法:编译看左,运行看左
多态的弊端:无法访问子类特有的成员方法(可以用向下转型来解决)
向下转型:
曹操和曹植的案例
class 曹操{
fight();
teach();
}
class 曹植 extends 曹操{
teach();
jump();
}
有一天,曹操出去打仗了,家里只有曹植在家,这时候敌人来了,将士们只听曹操的指挥
这时候曹植想到一个点子,开始装爹,穿上爹的衣服,粘上假胡子
曹操 c = new 曹植(); // 向上转型
c.teach();
曹操回来了,曹植做回自己,脱掉爹的衣服,撕掉假胡子
曹植 c2 = (曹植)c; // 向下转型
c2.teach();
c2.jump();
二、abstract(抽象)
抽象类:不是具体的类
java针对描述现实生活中抽象的概念,提供了一个关键字给我们使用abstract
可以修饰类和成员方法
abstract使用的注意事项:
1、修饰方法的时候,方法变成抽象方法,不能有具体的实现,连大括号都不能有
2、当一个类中的方法是抽象方法的时候,这个类必须要定义成抽象类
3、抽象类中既可以存在抽象方法,也可以存在具体的实现方法
4、当一个具体的类继承抽象类的时候,必须要重写抽象父类中的所有抽象方法
5、当抽象类继承抽象类的时候,可以不用重写抽象方法,也可以选择重写
package com.shujia.day07; /* 抽象类:不是具体的类 java针对描述现实生活中抽象的概念,提供了一个关键字给我们使用abstract 可以修饰类和方法 abstract使用的注意事项: 1、修饰方法的时候,方法变成抽象方法,不能有具体的实现,连大括号都不能有 2、当一个类中的方法是抽象方法的时候,这个类必须要定义成抽象类 3、抽象类中既可以存在抽象方法,也可以存在具体的实现方法 4、当一个具体的类继承抽象类的时候,必须要重写抽象父类中的所有抽象方法 5、当抽象类继承抽象类的时候,可以不用重写抽象方法,也可以选择重写 */ abstract class Animal2{ public abstract void eat(); public abstract void sleep(); public void fun1(){ System.out.println("世界和平"); } } abstract class Demo2 extends Animal2{ @Override public void eat() { } } class Cat extends Animal2{ @Override public void eat() { } @Override public void sleep() { } } class Dog2 extends Animal2{ @Override public void eat(){ System.out.println("🐕吃🥩"); } @Override public void sleep(){ System.out.println("🐕躺着睡"); } } public class AbstractDemo1 { public static void main(String[] args) { } }
抽象类中的成员特点:
成员变量: 既可以是变量,也可以是常量
构造方法: 抽象类无法被实例化,存在构造方法的意义是什么?用于做初始化的
成员方法: 既可以是抽象方法,也可以是具体的实现
package com.shujia.day07; /* 抽象类中的成员特点: 成员变量: 既可以是变量,也可以是常量 构造方法: 抽象类无法被实例化,存在构造方法的意义是什么?用于做初始化的 成员方法: 既可以是抽象方法,也可以是具体的实现 */ abstract class Demo4{ int a = 10; // 变量 final int b = 20; //常量 } class Demo4Zi extends Demo4{ public void fun1(){ System.out.println(a); System.out.println(b); } } public class AbstractDemo3 { public static void main(String[] args) { // Demo4Zi dz = new Demo4Zi(); // System.out.println(dz.a); // System.out.println(dz.b); // Demo4 d = new Demo4(); } }
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以
意义: 1. 提供模板或基类
2. 规范化子类结构
3. 防止直接实例化
abstract不能和哪些关键字共存
1) 不能与private关键字共存
2) 不能与static共存
3) 不能与final共存
三、接口 interface
概述:用来描述类的额外扩展功能的,可以看作成一个特殊的类
功能:当一个类需要使用额外扩展功能的时候,使用implements关键字进行使用接口
接口中的成员特点:
成员变量:接口中只允许定义常量,默认存在修饰符 public static final
构造方法:接口中不存在构造方法,无法进行实例化
成员方法;接口中只允许定义抽象方法,方法默认会添加修饰符 public abstract
注意事项:
1、类和接口的关系是实现关系,例如类Dog要实现Jump接口 class Dog implements Jump{}
2、具体的类实现一个接口的时候,必须要实现接口中所有的抽象方法
package com.shujia.day07; //将跳高定义成一个接口 interface Jump{ int a = 10; void jumping(); } abstract class Animal3{ public abstract void eat(); public abstract void sleep(); } class Dog3 extends Animal3{ @Override public void eat() { System.out.println("狗吃肉"); } @Override public void sleep() { System.out.println("狗趴着睡"); } } //定义一个会跳高的狗 class JumpDog extends Dog3 implements Jump{ @Override public void jumping() { System.out.println("狗会跳高"); } } public class InterfaceDemo1 { public static void main(String[] args) { // Dog3 dog3 = new Dog3(); // System.out.println(dog3.a); // System.out.println(Jump.a); // Jump j = new Jump(); Jump j = new JumpDog(); //接口多态 j.jumping(); // j.eat(); // j.sleep(); } }
类与类,类与接口以及接口与接口类与类之间的关系:存在继承关系,只能单继承,不能多继承,但是可以多层继承,形成继承体系
类与接口的关系:存在实现关系,implements,可以一次性实现多个接口
接口与接口的关系:存在继承关系,可以存在多继承
四、包(文件夹,目录)
1、划分的方式
根据功能划分
根据角色划分
2、导包的方式:
1、import xxx.xxxx.xxx;
2、在package和所有class之间进行导入
3、导入的时候可以使用.*的方式导入所有,但是不建议,因为将来会将项目打包
五、权限修饰符
1.Public(公共): 当使用public修饰一个类、方法、变量或构造函数时,它们可以在任何地方被访问和使用,无论是在同一个包内还是在其他包中。
2. Protected(受保护的): 当使用protected修饰一个类成员时,它们可以在同一个包内和子类中被访问和使用。对于不同包中的非子类,只有在通过继承关系建立对象后才能访问。
3. Default(默认的,没有关键字修饰): 如果没有使用任何修饰符来修饰一个类、方法、变量或构造函数,则它们具有默认访问级别。默认访问级别限定了只能在同一个包内进行访问和使用。
4. Private(私有的): 当使用private修饰一个类成员时,它们只能在同一个类的内部被访问和使用,无法在其他类中进行访问。
六、内部类
1、成员内部类:.
将类定义在类中方法外
常见的两种修饰符:static,private
2、局部内部类:
将类定义在成员方法的内部
3、匿名内部类
语句定义格式:new 类/抽象类/接口(){
重写方法; }
主要使用场景:将匿名内部类作为方法的参数进行传递;将匿名内部类作为方法的返回值进行返回。
package com.shujia.day08.ketang; /* 匿名内部类的第二种用法:将匿名内部类作为返回值返回 */ interface Inter2{ void show(); } //class Inter2Impl implements Inter2{ // @Override // public void show() { // System.out.println("刘中义真帅!"); // } //} class Inter2Demo{ public Inter2 fun(){ // return new Inter2Impl(); //使用匿名内部类改写 return new Inter2() { @Override public void show() { System.out.println("中义很帅!"); } }; } } public class NIMingInnerClassDemo2 { public static void main(String[] args) { Inter2Demo inter2Demo = new Inter2Demo(); Inter2 inter2 = inter2Demo.fun(); inter2.show(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!