javaSE(基础):5.抽象类和接口
抽象类
一.理解抽象类
思维:假如我想定义一个Shape(图形类)类,我在这个类中写了一个draw()方法,但是这个方法是不能用来描述图形形状的(不能有方法体),因为我只要对他进行了准确描述,那他的形状就定死了。
所以,如果我们想要定义一个形状如:三角形——》写一个三角形类,三角形也是图形的一种是吧,所以我们就可以继承Shape类,并一定要重写父类中的方法(如果你不重写的话不就相当与白继承了一个类吗?父类的方法中什么也没写呀),通过重写父类方法获得一个你心目中的“三角形”。这个Shape类就是抽象类,他的使用方法也是如此。
二.抽象类的语法
在Java中,一个类如果被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,该方法不能有方法体,是必须要被子类重写的,否则会报错;
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
三.抽象类的特性
1. 抽象类不能直接实例化对象

只可以像普通父类一样引用子类new的对象。
2. 抽象方法不能是 private 的
就是说,abstract和private不能同时出现。
3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
4.1如:
4.2若Main类也使用abstract修饰,那么后面有类继承了Main类的话要么还是使用abstract修饰,要么就重写Abstract和Mian这两个类的抽象方法,依次类推...
5.
5.总结:抽象类的作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.
有些人可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?
确实如此. 但是使用抽象类相当于多了一重编译器的校验.
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类对象了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的.
接口
接口可以理解为是比抽象类更抽象的东西。
一.接口的概念
接口的例子在生活中到处都是:如笔记本上的USB口,电源插座等。、
电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备
电源插座插孔上,可以插:电脑、电视机、电饭煲...所有符合规范的设备
通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
二.语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
1.接口名称通常以大写字母 I 开头表示。
2.接口的命名一般使用“形容词”词性的单词。
1.1接口特性
1.接口中定义的成员变量是默认被public static final 修饰的,所以我们为了保持整洁可以不写public static final。
2.接口中的方法被默认修饰为public abstract,因此可以省略不写。
3.如果接口中的方法被default修饰,那么可以有具体的代码实现。
4.如果接口中的方法被static修饰,那么它也可以有具体的实现。
3.接口中除被default和static修饰方法外都要被重写(除非子类被abstract修饰)否则就报错。
2.1.1继承接口
1.子类使用“implements”关键字继承接口。如:例一
2.我们知道子类只能继承一个父类,但是一个子类却可以继承多个接口。如:例一
3.接口和接口之间可以使用“extends”拓展。如:例二
例一:
例二:
三.实战接口