Java学习day12-13抽象类和接口

今日目标

抽象类
接口

一.抽象类

1.如何理解抽象方法

1.抽象方法衍生背景
“用进废退”:多态的领域, 父类中被子类重写的实例方法,功能逐渐淡化,索性去掉方法体 退化为抽象方法

2.抽象方法使用规则
1.抽象方法没有方法体
2.含有抽象方法的类必须是抽象类
3.抽象类中可以暂时没有抽象方法
4.抽象类中的抽象方法跟子类有什么联系?
(1)如果子类完全实现了父类的抽象方法,那么子类可以不用声明为抽象类
(2)如果子类没有完全实现父类的抽象方法,那么子类必须声明为抽象类

2.抽象类的语法规则

1.被abstract修饰的类是抽象类
2.抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以没有。
3.抽象方法没有方法体,只有方法声明。
4.子类继承抽象类需要重写父类所有的抽象方法,否则,子类也必须声明为抽象类
5.抽象类有构造方法,但是不能被显示调用,也就是不能实例化,或者说抽象类没有对象。
6.抽象类的构造方法只在子类实例化时隐式调用。
7.抽象类的使用一般是作为引用类型,指向非抽象的引用实例,体现出多态。
8.构造方法和静态方法都不能(abstract)抽象修饰

静态方法不能被子类覆盖(重写),一旦声明为抽象方法 将永远没有具体的实现

案例:
使用抽象类和抽象方法,模拟愚公移山,在第三代完成了移山。再给愚公一个目标:填海,在第四代完成了填海。

//愚公  目标:移山  填海
public abstract class FoolishMan {
   

    public abstract void moveMountain();
    public abstract void fillOcean();


}
public class TestFool {
   
    public static void main(String[] args) {
   
        Zi3 z3 = new Zi3();
        z3.fillOcean();
        z3.moveMountain();
    }
}
public abstract class Zi1 extends FoolishMan {
   

}
public abstract class Zi2 extends Zi1 {
   

    @Override
    public void moveMountain() {
   
        System.out.println("第3代完成了移山大业");
    }
}
public class Zi3 extends Zi2 {
   
    @Override
    public void fillOcean() {
   
        System.out.println("完成了填海");
    }
}

二.接口(day13)

接口可以理解为定义的一组通用的组件,或者是对外提供服务的功能模块。接口比抽象类更抽象,已经完全抽象得没边没影。
接口通常作为实体类的成员属性,和类是附属关系,而不是包含关系。

1.接口的语法规则

1.定义一个接口:
public interface 接口名{
}
和定义类的区别在于,将class关键字换成了interface
2.接口中也有成员属性和方法
成员属性: public static final (公共的静态常量)类型
成员方法:public abstract (公共的抽象方法) 或静态方法

在这里插入图片描述
上面的
public static final int A=6;可以省略为 int A=6;
public abstract void show();可以省略为 void show();

3.接口的应用理解:
接口可以理解为定义的一组通用的组件,或者是对外提供服务的功能模块,具体可替换,可拆卸的特点。接口比抽象类更抽象,已经完全抽象得没边没影。
接口通常作为实体类的成员属性,和实体类是附属关系,而不是包含关系。

2.深入思考:

1.为什么接口中的属性是静态的常量?
(1)首先接口由于少了方法的实现,所以不能实例化,这个与抽象类一致,
(2)由于不能实例化,所以对于成员变量只能是static
(3)由于是static所以所有实现了接口的类共享一份
(4)由于所有人共享一份,同时接口的定义是“所有实现该接口的人都共同拥有这些属性/功能”
(5)由于所有的实现类都共同拥有,若是变量则实现类A的改变会导致实现B的改变
(6)会由于实现类的操作而改变的东西违反了接口的定义
(7)所以为了确保每个实现的接口都共同遵守这个“属性”,属性必须是final
(8)由于接口本身的定义是public,最后就是 public static final xxx
(9)若以上说明不够清楚,那就理解为:甲鱼的臀部–龟腚

3.关于default

1.Jdk8开始,允许接口中有实例方法,但是必须被default修饰

2.出现背景:
对已有的接口,如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免对其他实现类的修改。

3.语法规则:
1.实现类不需要重写default修饰的方法 但是也会继承接口中的default方法
2.如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法。为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。
3.如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类需要同时重写父类和接口中的b方法。
4.如果一个接口A被标记成函数式接口,那么他所继承的父接口中的抽象方法 必须要用default方法重写,因为函数式接口的规定是:接口中只能有一个抽象方法。接口A中的抽象方法加上继承的父接口中的抽象方法个数之和只能是1.
关键字总结
截至目前,我们学过的面向对象中关键字有:this ,super ,abstract ,static 。你能说明各自的含义和作用吗?
总结:
1.抽象度:接口>抽象类>类>对象
2.抽象类不能显示调用构造方法,不能直接创建对象,但可以在子类调用构造方法时隐式被调用。
3.接口中只有抽象方法和静态方法,没有构造方法。
4.接口:提供连接外部组件的口子。所以属性和方法都必须是public
5.抽象类抽掉了对象的概念,接口进一步抽掉了类的概念。
6.接口中的属性没有set/get,也就是不能封装,是static final类型,因为接口已经不再可以理解成类,而是一个组件。组件的属性在出厂时就已经定型了。
7.多态的使用演变:

  1. Fu f=new Zi(); Fu是一个普通类
    2.Fu f=new Zi(); Fu是一个抽象类
    3.Fu f=new Zi(); Fu是一个接口,(使用最多)

作业:

一.abstract可以修饰构造方法和静态方法吗?代码演示
思考:用abstract修饰方法的目的是什么,为何要用abstract修饰?
抽象方法没有方法体,根据达尔文的生物进化论“用进废退”,食蚁兽的舌头就是典型的例子。
1.为啥没有方法体呢?子类继承父类,往往会重写父类的方法,也就是会覆盖父类的方法,这个时候,父类的方法体基本没有用,所以直接不要方法体,用abstract修饰,变成抽象方法。再看静态方法,它是属于类空间,不可以被重写,所以自然不能省略掉方法体。构造方法也不能被重写,自然也不能被abstract修饰。
2.静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现

二.接口UsbInterface,实现类usb电风扇UsbFan和u盘UDisk,接口中有service方法,实现类予以实现。

三.抽象类门有两个抽象方法,关和开;接口锁也有两个抽象方,锁门(lockUp)和开锁(openLock);防盗门类TheftproofDoor,继承门,实现锁接口的抽象方法(共4个)。编写测试类,调用防盗门重写的四个抽象方法。

@Override
	public void lockUp() {
   
		System.out.println("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。");
	}
	@Override
	public void openLock() {
   
		System.out.println("插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。");
	}
	@Override
	public void open() {
   
		System.out.println("用力推,门打开了。");
	}
	@Override
	public void close() {
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值