接口 多态
接口 Interface
比抽象类更抽象的类,只描述所该具备的方法,没有方法体,由接口的实现类(相当于子类)去实现。
①接口里只能是抽象方法 ② 接口中无法定义普通成员变量
定义格式:
public interface 接口名 { 抽象方法1; 抽象方法2; 抽象方法3; }
特点:
l 接口中的方法均为公共访问的抽象方法 2 无法定义普通的成员变量
类实现接口 implements 所有的接口都是用实现 不能说继承
接口特点
1、接口是对外暴露的规则
2、程序的功能扩展
3、降低耦合度
4、用来多实现
5、类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
6、接口与接口直接可以有继承关系,且接口可以多继承
格式
class 类 implements 接口 { 重写接口中方法 }
package com.oracle.demo01; //接口类型 把class改成 interface 左侧图标变成 i 抽象类是变成 a public interface Smoking { //抽象方法:public abstract 返回值类型 方法名(参数列表) //成员变量特点:public static final 变量名=变量值; //a:静态常量。常量:定义之后终身不变 public static final int a=1; //接口里面只能有 abstract //抽象方法:public abstract 返回值类型 方法名(参数列表) //所有抽象方法不管你写不写 都默认public abstract修饰 public abstract void smoke(); } ----------------------------------------------------------------- package com.oracle.demo01; //让student 去实现用implements Smoking接口 public class Student implements Smoking{ //重写 如果public后面不加abstract 就重写 2选1 @Override public void smoke() { System.out.println("学生抽烟"); } } ----------------------------------------------------------------- package com.oracle.demo01; //测试 public class Demo { public static void main(String[] args) { //新建一个student方法 Student student = new Student(); //调用 smoke 方法 student.smoke(); //静态常量可以通过类名.变量名调用 System.out.println(Student.a);//也可以用Smoking.a } }
接口成员方法特点
接口可以定义变量,变量固定修饰符 public static final
成员变量特点:public static final 变量名=变量值; (用static final 静 态修饰 常量 终身不变)
3不能创建对象(因为抽象类不可以创建,接口比抽象类还抽象 so.)
4 接口成员可以定义方法,固定修饰符,public abstract
由图得出结论
接口多实现 :不能多继承 但可以多实现
怎么解决多继承的弊端呢?
弊端:多继承时,多个父类都有主体,子类调用产生不确定性。
原因:多继承父类有主体,导致调用运行,不知道调用哪个
为什么多实现能解决了呢?接口中的功能都没有方法体,由子类来明确。
类继承类同时实现接口
接口弥补了java里单继承局限性 父类定义基本功能 ,接口定义扩展功能(可以理解为继承的重写、覆盖:子类继承了父类的方法并扩展了自己的方法)
class Fu { public void show(){} } //接口的方法 inter interface Inter { pulbic abstract void show1(); } //先继承 后接口 class Zi extends Fu implements Inter { public void show1() { } }
接口多继承 (都是接口就可以多继承 interface)
①类和接口是实现关系
②类继承一个类的同时,实现多个接口
③一个接口可以继承多个接口
interface Fu1{ //接口Fu1 void show(); } interface Fu2{ //接口Fu2 void show1(); } interface Fu3{ ////接口Fu3 void show2(); } //Zi可以竭诚 Fu1Fu2Fu3 interface Zi extends Fu1,Fu2,Fu3{ void show3(); } //类和接口 是实现 //类可以继承后实现 //一个接口可以继承多个接口
接口和抽象区别
相同点:
①都位于继承顶端,被其他类实现或继承
② 都不能new对象
③都包含抽象方法,子类都覆盖重写方法
区别:
① 抽象类允许存在普通方法,避免子类重复实现这些方法。接口只有抽象方法
② 一个类只能继承一个直接父类,可实现多个接口。接口弥补了java单继承
③ 抽象类是这个事物该具备的内容,继承体系是一种 is..a关系
④ 接口是事物额外的功能,继承体系是like..a关系
二者选用:优先用接口!
多态
定义、格式
定义:就是父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
多态中成员访问特点:
:成员变量
编译和运行都看左边
:成员方法
编译看左,运行看右 (由于成员方法存在重写,所以运行看右边 )
:静态方法
编译 和运行都看左边
(静态和类相关,算不上重写,所以访问是左边)
:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
package com.oracle.demo02; //这是父类 public class Fu { int a=1; } ---------------------------------------------------- package com.oracle.demo02; public class Zi extends Fu{ int a=2; } --------------------------------------- package com.oracle.demo02; public class Demo02 { public static void main(String[] args) { //多态中调用成员变量的特点 //编译、运行 看左边 Fu f=new Zi(); System.out.println(f.a); } }
instanceof 关键字
格式:
boolean b = 对象 instanceof 数据类型;
多态转型 两种
向上转型:
子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
向下转型:
一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用
格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
好处与弊端
作业:
1、多态是什么,多态的前提条件是什么?
2、多态中成员访问的特点分别是什么?
成员变量
成员方法(非静态方法)
静态方法
3、什么是接口,它的特点是什么?
4、接口的成员特点有哪些?
5、抽象类和接口的区别是什么?
6:定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并且 重写eat方法
测试类中写一个方法,参数列表有一个参数Animla类型,
要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行将转后调用eat,和他们的特有方法
7.测试: 如果一个方法的返回值类型是父类,那么能否返回一个子类对象.(该父类不管是类,抽象类还是接口)
8.现有两种 OldPhone NewPhone; 两个类都有call() sendMessage() 方法(考虑向上抽取一个父类);
已知接口IPlay中有一个方法 playGame(),NewPhone添加玩游戏的功能;
要求: 分别测试OldPhone和NewPhone的两个方法,再测试新手机palyGame()的方法.
9 .(完成下面的汽车案例)
描述:汽车都具有跑的功能,普通的奥迪车也不例外,但是高端的奥迪车除了具有跑的功能外,还具有自动泊车和无人驾驶的功能!
需求:定义普通奥迪车,高端奥迪车,实现描述中的功能并测试