目录
接口
java的三种引用类型之一,方法的集合,内部封装了方法。
接口的实现
关键字implements
抽象方法:子类必须重写。
默认方法:可继承与重写。
静态方法:无法重写。
私有方法(了解):默认方法调用。
私有静态方法(了解):默认方法与静态方法调用。
package ch_interface;
/*
* 接口:第三大引用类型(数组、类、接口)
*
* 接口{
* 成员方法(抽象、默认、静态、私有)
* }
* */
public interface Demo01 {
public abstract void eat();
public abstract void sleep();
public default void la(){
System.out.println("上厕所");
}
public static void sa(){
System.out.println("上洗手间");
}
}
package ch_interface;
public class Test implements Demo01 {
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void sleep() {
System.out.println("睡觉");
}
@Override
public void la() {
System.out.println("我上厕所");
//super.la();
}
public static void main(String[] args) {
Test t1 = new Test();
t1.eat();
t1.sleep();
t1.la();
Demo01.sa();
}
}
接口多实现
一个类实现多个接口
1、抽象方法重名:只重写一个
2、默认方法重名:必须重写一次
3、类继承的父类与实现的方法重名:优先继承父类中方法
package ch_interface;
public class Demo {
//public abstract void sleep();
public void la(){
System.out.println("上厕所");
}
}
package ch_interface;
public interface Demo02 {
public abstract void eat();
public default void la(){
System.out.println("上厕所");
}
public static void sa(){
/*
* 静态方法重名不冲突
* */
System.out.println("上洗手间");
}
}
package ch_interface;
public class Test01 extends Demo implements Demo01,Demo02 {
@Override
public void eat() {
System.out.println("重名了,只写一次");
}
@Override
public void sleep() {
}
@Override
public void la() {//如果类继承了父类又实现接口,父类与接口方法重名,则优先继承父类方法
System.out.println("默认方法重名,必须重写一次");
}
}
接口多继承
接口继承父接口
父接口默认方法重名,子接口需重写一次。
package ch_interface;
public interface Demo3 extends Demo01,Demo02 {
@Override
void eat();
@Override
void sleep();
@Override
default void la() {
System.out.println("接口多继承,default可以保留");
}
}
多态
继承——方法的重写——父类指向子类对象。
好处:父类型为函数参数,传递子类对象给方法,当父类被多个继承时,只需写一个方法,简便的调用子类重写的方法
package ch_duotai;
/*
* 不重写,失去多态的意义
* */
public abstract class Fu {
public abstract void eat();
}
package ch_duotai;
public class Zi02 extends Fu {
@Override
public void eat() {
System.out.println("我吃");
}
public void la(){
System.out.println("456");
}
}
package ch_duotai;
public class Zi01 extends Fu {
@Override
public void eat() {
System.out.println("你吃");
}
public void sleep(){
System.out.println("123");
}
}
package ch_duotai;
public class Test {
public static void main(String[] args) {
Fu f1 = new Zi01();//向上转换
f1.eat();
Fu f2 = new Zi02();
f2.eat();
Zi01 z1 = new Zi01();
showEat1(z1);
showEat2(z1);
Zi02 z2 =(Zi02)f2;//向下转换
//防止转换中出错
if (f1 instanceof Zi01){
Zi01 z3 = (Zi01)f1;
z3.sleep();
}
else if (f1 instanceof Zi02){
Zi02 z4 = (Zi02)f1;
z4.la();
}
}
public static void showEat1(Zi01 z1){
z1.eat();
}
public static void showEat2(Fu f1){//多态的好处:规定调用子类重写的方法,则父类有多个子类时,减少了代码量
f1.eat();
}
}