java基础笔记008 — 面向对象
今日内容
1. 【理解】什么是接口
2. 【掌握】接口的定义格式
3. 【掌握】接口的使用
4. 【理解】接口的成员特点
5. 【理解】类和接口 抽象类和接口之间的关系
6. 【掌握】单继承多实现
7. 【理解】接口之间的多继承
9. 【理解】什么是多态态
10. 【理解】使用多态的前提
11. 【掌握】多态的格式
12. 【理解】多态中的成员访问特点
13. 【理解】多态中的好处和弊端
14. 【理解】多态中的转型
15. 【理解】转型的异常
一、接口
- 接口概念
接口就是公共的规范标准,是基抽象类又向上抽取,是方法的集合。集合中主要存放的也是方法(抽象、默认、静态、私有(jdk9)方法)
- 接口定义
public interface 接口名{}
- 接口的使用 implements关键字
//接口中主要是抽象方法,所以同抽象类一样不能new对象,但接口可以被类实现
public class 类名 implements 接口名{}
- 注意
接口的实现类必须实现接口中所有抽象方法,否则实现类该是一个抽象类
二、接口成员
- 成员变量
只能是常量,默认修饰符:public static final(可省略)
-
没有构造方法
-
成员方法
- 抽象方法 2. 静态方法 3. 默认方法
public interface Diagarm {
//成员变量
//只能是常量,默认修饰符 public static final
double PI = 3.1415926;
//PI = 1.0;
//1.抽象方法,默认修饰符 public abstract
void a();
void a(int i);
//2.静态方法,可以通过接口名直接调用的方法,有方法体
static void b(){
System.out.println("bbbbbbbbbbb");
}
//3.默认方法,可以通过实现类对象调用的方法,有方法体
default void c(){
System.out.println("cccccccc");
}
}
三、接口特点
- 实现类与接口支持多实现
public class 类 implements 接口1,接口2,..,接口n{}
//接口的多实现中,若出现实现的接口中有相同方法,编辑器会提示实现哪个接口的的方法
- 接口与接口支持多继承
public interface 接口1 extends 接口2,接口3{}
四、多态
- 概念
多态就是不同类的对象在调用同一个方法时呈现出多种不同结果。
- 前提
- 存在继承或实现关系
- 存在方法的重写
- 向上转型(父类引用指向子类对象)
- 格式
//普通继承
父类 引用变量 = new 子类();
//抽象类继承
抽象类 引用变量 = new 抽象子类();
//接口实现
接口 引用变量 = new 实现类();
- 成员(成员变量/方法)的访问
-
成员变量
编译看父类,运行看父类
-
成员方法
编译看父类,运行看子类(子类没重写时,运行还是看父类)
public class A{
int a = 9;
public void aa(){
System.out.println("父类方法");
}
}
public class B extends A{
int a = 3;
//重写方法
public void aa(){
System.out.println("子类方法");
}
}
- 使用多态的好处与弊端
- 好处
1.提高代码的扩展性和可维护性,减少代码冗余
2.定义方法时,将父类型或接口作为参数或返回值类型,在使用时,可使用任意具体子类操作
- 弊端
1.多态中只能使用父类属性以及子类重写父类的方法和父类方法,不能使用子类特有属性和方法
- 多态之转型
- 向上转型
// 多态使用本身就是子类向父类/接口转型,默认的
父类类型 变量 = new 子类类型();
- 向下转型
// 父类类型向子类类型转换,强制的。
子类类型 变量 = (子类类型)父类变量;
向下转型时,只有当父类变量是向上转型创建的,才能使用,且前后子类类型一致,如:
public A{
public void aa(){
System.out.println("父类方法");
}
}
public class B extends A{
public void aa(){
System.out.println("子类重写父类方法");
}
}
public class Test{
public static void main(String[] args){
A a = new A();
B b = (B)a;//报异常ClassCastException
A a1 = new B();//向上转型
B b1 = (B)a1; //向下转型,成功
}
}
- instanceof关键字
//判断变量是否属于某数据类型
变量名 instanceof 数据类型
当数据类型为变量的数据类型或其父类时 返回 true
不属于 返回 false
//结合上个例子
A a1 = new B();//向上转型
B b1 = new B();
(a1 instanceof A) true
(a1 instanceof B) true
(a1 instanceof B) true