(一)关于抽象类的注意点
1、被abstract修饰的类称之为抽象类,被abstract修饰的方法称之为抽象方法
2、一个类中如果有抽象方法,那么这个类必须成为抽象类
3、抽象类不能实例化!!,换句话说,就是不能自己new自己。
4、抽象类必须要有一个子类,子类可以实现抽象类中的抽象方法。如果子类实现类抽象类中的所有方法,那么就可以通过向上造型来使用抽象类。(Java多态性体现)
public class AbstractDemo1 {
public static void main(String[] args) {
AbstractA a = new TestB();
a.doWork();
a.play();
}
}abstract class AbstractA{
public int salary(){
return 1000000;
}
public abstract void play();
public abstract void doWork();
}class TestB extends AbstractA{
@Override
public void play() {
System.out.println("一起来嗨皮");
}
@Override
public void doWork() {
System.out.println("一起来工作");
}
}
5、抽象类是可以写构造方法的。
6、抽象类可以提供普通方法。
7、抽象类中的抽象方法可以重载。重载的方法也必须为抽象方法
public abstract void doWork();
public abstract void doWork(String name);
8、抽象类的子类如果没有完全实现父类的抽象方法,那么子类也需要变成抽象类,子类的子类再去实现抽象方法。
9、final修饰的类是最终类,不能被继承,抽象类必须要被继承后实现抽象方法,所以final不能修饰抽象类。
10、抽象类中的抽象方法,不能使用private修饰,因为抽象方法必须要被子类实现。
11、抽象类中的抽象方法,不能使用static修饰,因为静态方法可以直接使用类名调用,在抽象方法中没有意义。
12、受java的单继承的影响,抽象类不能够同时继承多个父类。
(二)关于接口的注意点
(1)接口是功能的集合。接口是比抽象类更抽象的"类".在JDK1.8之前接口中只能放抽象方法。
(2)接口中的抽象方法,必须使用public abstract修饰,可以省略,但是省略后默认还是使用public abstract修饰,也可以省略其中一个。
abstract void work();
public void play();
(3)接口中是可以定义变量,但是变量默认会使用public static final修饰,所以实际上是一个常量。
(4)使用javap XXX.class 可以进行反编译。
(5)接口不能够直接实例化,可以通过向上转型,或者匿名内部类的方法
(6)使用接口需要写一个接口的实现类来实现接口中所有的抽象方法。使用时使用向上造型,就可以调用接口中的抽象方法了。
(7)接口不能有构造方法
(8)接口中的方法可以重载。
(9)类和接口可以做到多实现。如果有多个接口,那么在implements后面通过,分割不同的接口
interface Inter1 {
public void play();
}
interface Inter2 {
public void work();
}
interface Inter3 {
public void sleep();
}
class DemoA implements Inter1 , Inter2 , Inter3{@Override
public void sleep() {
System.out.println("赶快去睡觉");
}
@Override
public void work() {
System.out.println("一起来工作");
}
@Override
public void play() {
System.out.println("一起来嗨皮");
}
}
(10)接口和接口之间可以做到多继承。
interface Inter4 extends Inter1, Inter2, Inter3 {
}
(11)子接口和父接口中可以允许有重名的方法。因为接口中没有方法的实现。实现是看子类如何实现的。
interface Inter3 {
public void sleep();
}
interface Inter4 extends Inter1, Inter2, Inter3 {
public void sleep();
}
(12)java中类和类的继承关系是树状结构,接口之间是网状结构。
补充: 由于接口的多实现和多继承,所以为了提高编译效率,在编译阶段不会检查强转的类型是否匹配。
class TestDemo{
public static void main(String[] args) {
Inter4 i = (Inter4) new DemoA();
}
}interface Inter4{
public void sleep();
}
class DemoA{
}
虽然DemoA与Inter4不具有实现关系,但仍然能强转成功。虽然在编译阶段不会报错,但运行阶段会报错。
java.lang.ClassCastException