抽象类
在我看来,抽象类就是一个模板(相当于是一种概念,所以没有实例)。不用太纠结什么是抽象类,反正都是抽象出来的东西
相比于普通类,抽象类在类名前有abstract修饰符 ,然后就是可能会增加一些抽象方法
并且不能通过new来创建实例对象(但是抽象类有构造方法),只能由继承它并重写了其所有抽象方法的子类来创建实例对象
- 抽象类可以有抽象方法也可以没有,由abstract关键字修饰的方法、没有方法体(有抽象方法的一定是抽象类)
- 抽象类实际上就多了一些抽象方法而已,虽然抽象类中抽象方法可有可无
抽象类
public abstract class Animal {
private void run() {
}
public static void method() {
System.out.println("抽象类中的静态成员方法");
}
public Animal() {
System.out.println("这是抽象类的构造方法"); //抽象类可以有构造方法
}
public void method1() {
System.out.println("这是普通方法1");
}
public abstract void eat();
public abstract void sleep();
}
子类(普通类)必须重写父类的抽象方法
public class Dog extends Animal {
private void run() {
}
public static void method() {
System.out.println("子类隐藏父类的静态成员方法");
}
public Dog() {
System.out.println("这是子类的构造方法");
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
}
子类(抽象类) 可以不用对抽象方法重写
public abstract class Bird extends Animal{
public Bird() {
// TODO Auto-generated constructor stub
System.out.println("抽象类继承抽象类");
}
}
上面的代码中,子类父类都存在一个完全相同的静态方法method() 可以发现在eclipse中也没有@override注解出现,如果加上@override注解将会报错,静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏替换,所以这里并不是重写,可以看作这两个方法并无关系。
抽象方法不能搭配的修饰关键字static、final、private (不能是本地方法[native]、也不能被synchronized修饰)
- 抽象方法不能由static修饰,static修饰的方法为静态方法,随着类的创建而创建,抽象方法是需要子类重写才能调用的,也就是说是动态的。静态方法可以由类.方法名直接调用,但是抽象方法是没有方法体的,不能直接调用,并且静态方法本身就不能被重写
- 由下图可知如果用static 修饰抽象方法,在eclipse中会报错 抽象方法只能由public和protect修饰
- final和abstract搭配则毫无意义,final意为最终的,不能修改和重写,而abstract是需要继承然后重写的, 所以结果很明显
- private修饰的方法为类私有,子类能继承但是不能访问,故不能重写,与抽象方法必须重写相矛盾
- 本地方法(native)是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。
- synchronized 修饰没有方法体的抽象方法???
- 抽象方法只能用public和protect访问修饰符
接口
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。
接口中的方法定义默认为public abstract类型
接口中的成员变量类型默认为public static final。
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中可以有普通成员变量,接口中没有普通成员变量
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
7. 一个类可以实现多个接口,但只能继承一个抽象类。