接口
当一个类中所有方法都是抽象方法的时候,就可以将其定义为接口
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
意义:
- 规则的定义
- 测序的扩展性
定义格式:
public interface 接口名{...}
实现格式:
public class 类名 implements 接口名 {...}
特点:
- 接口不能实例化
- 接口和类之间是实现关系
- 接口的实现类:
- 要么重写接口中所有抽象方法
- 要么是抽象类
- 命名规范:(接口名)+Impl
- 可以实现多个接口
接口中成员的特点:
- 构造方法:没有
- 成员变量:
- 只能是常量,系统会默认将变量修饰为 public static final
- 成员方法:
- 只能是抽象方法,系统会默认将方法修饰为 public abstract
JDK8之后的变化:
-
默认方法
- 作用:
- 解决接口的升级问题。在没有默认类以前,更改接口的话,那么其所有实现类都要做出相应的修改。
- 定义格式
- public default 返回值类型 方法名(参数列表){…}
- 注意事项:
- 默认方法不强制重写,但是可以被重写,重写时去掉default关键字
- public可以省略,default不能省略
- 如果实现多个接口,多个接口中存在相同的方法声明,实现类必须对该方法进行重写
- 作用:
-
静态方法
- 作用:
- 使默认方法调用更加简洁
- 定义格式
- public static 返回值类型 方法名(参数列表){…}
- 注意事项:
- 静态方法只能通过接口名调用*(接口名.方法名)*,不能通过实现类名或对象名调用
- public可省略,static不能省略
- 作用:
JDK9的变化
-
私有方法
-
作用:
当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用,只供本类使用,因此用私有给隐藏起来。
-
定义格式
- private 返回值类型 方法名(参数列表){…}
- private static 返回值类型 方法名(参数列表){…}
-
注意事项
- 默认方法可以调用私有的静态方法和非静态方法
- 静态方法只能调用私有的静态方法
-
接口和类的关系
-
类和接口的关系
可以单实现,也可以多实现,也可以继承一个类的同时实现多个或单个接口
如果直接父类和接口中出现了相同的方法声明,但是代码逻辑不一样,优先使用直接父类的代码逻辑
-
接口和接口的关系
可以单继承也可以多继承(不是多层继承)
多继承的多个父类有冲突的方法时,系统会强制要求重写
多态
-
概述
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
————
原文链接:https://blog.csdn.net/qq_41679818/article/details/90523285 -
多态的前提
- 要有继承/实现关系
- 要有方法的重写
- 要有父类引用指向子类对象 (父类类型 对象名 = new 子类类型();)
//代码实例 class Animal { public void eat(){ System.out.println("动物吃饭"); } } class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } } public class Test1Polymorphic { /* 多态的前提: 1. 要有(继承 \ 实现)关系 2. 要有方法重写 3. 要有父类引用, 指向子类对象 */ public static void main(String[] args) { // 当前事物, 是一只猫 Cat c = new Cat(); // 当前事物, 是一只动物 Animal a = new Cat(); a.eat(); } }
-
成员访问特点
- 成员变量
- 编译看父类,运行看父类
- 成员方法
- 编译看父类,运行看子类
- 构造方法
- 和继承一样,子类会通过super访问父类构造方法
//代码实例 class Fu { int num = 10; public void method(){ System.out.println("Fu.. method"); } } class Zi extends Fu { int num = 20; public void method(){ System.out.println("Zi.. method"); } } public class Test2Polymorpic { /* 多态的成员访问特点: 成员变量: 编译看左边 (父类), 运行看左边 (父类) 成员方法: 编译看左边 (父类), 运行看右边 (子类) */ public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); f.method(); } }
- 成员变量
-
好处和弊端
- 好处
- 提高程序扩展性
- 弊端
- 不能使用子类的特有成员
- 好处
-
转型
- 向上转型
- 父类引用指向子类对象就是向上转型
- 向下转型
- 格式:子类类型 对象名 = (子类型)父类引用;
- 向上转型
-
关键字:instanceof
- 作用:
- 判断变量是否是所要的类型
- 使用格式:
- 变量名 instanceof 类型
- 判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
- 作用: