抽象类和接口
使用多态时我们知道,父类引用指向子类对象,对象调用的方法是子类重写过的父类的方法。例如:
Class Person{
public void name(){
System.out.println("我有自己的名字");
}
}
Class Boy extends Person{
public void name(){
System.out.println("我自己的名字叫lds");
}
}
Class Test{
public static void main(String[] args){
Person p = new Boy();
p.name(); //这里输出的是子类Boy的方法体内容出来
}
}
多态一般用处都是调用子类的方法,那么父类的方法显得就有点多余,但是一般的类中的方法不能没有方法体,所以就有了抽象类和接口两个概念出来。
抽象类(接口 常用)
什么是抽象类,顾名思义类中就是抽象出来的方法。虽然没有方法体,但是却可以重写里面的所有的方法。可以提高代码的复用性。
类的格式为: 修饰符 abstract class 类名
如:public abstract class Person{}
方法的格式为: public abstract void name();
特点
-
因为抽象类(接口)的中的方法没有方法体(即使抽象类可以有方法体),有对象调用没意义,所以规定,抽象类(接口)是没有对象的。
-
正因为抽象类没有对象,那如何调用抽象类中的方法并且让其有意义呢?解决方法就是通过一个普通类去继承这个抽象类,然后重写抽象类里面的方法,然后用这个普通类生成一个对象去调用重写的方法即可。
/*定义一个抽象类*/ abstract class Person{ public abstract void name(); } /*定义普通类去继承这个实现类*/ Class Boy extends Person{ public void name(){ System.out.println("我自己的名字叫lds"); } } Class Test{ public static void main(String[] args){ Person p = new Boy(); //这里格式允许这样 但是不可以Person p = new Person(); p.name(); } }
-
一个方法中的形参可以是抽象类,也就是说如:
public void show(Person p){}
,当你看到方法为抽象类的时候,传入的是这个抽象类的子类的对象,因为抽象类无法生成对象。(接口也是如此原因就不赘述)/*定义一个抽象类*/ abstract class Person{ public abstract void name(); } /*定义普通类去继承这个实现类*/ Class Boy extends Person{ public void name(){ System.out.println("我自己的名字叫lds"); } } Class Test{ public static void main(String[] args){ Person p = new Student(); show(p); //编译成功 } /*定义一个普通方法*/ public static void show(person p){//这里为什么用static,因为在同一个类中,静态方法无法直接调用非静态方法,非静态方法可以直接调用静态方法(除了main方法) System.out.println("展示"); } }
接口和抽象类的区别
相同点:抽象类和接口都是可以有未实现的方法。
不同点:①抽象类中的方法如果没有加 abstract
的话可以是已经实现的方法;而接口必须是未能实现的方法,也就是抽象方法。②抽象类的修饰符和接口的修饰符不一样,子类继承父类的修饰符也不一样。
/*定义一个抽象类*/
abstract class Person{
public abstract void name();
public void show(){
System.out.println("展示");
}
}
/*定义一个接口*/
public interface Student {
public void show();
}
/*定义普通类去继承这个实现类*/
Class Boy extends Person{
public void name(){
System.out.println("我自己的名字叫lds");
}
public void show(){
System.out.println("展示aaa");
}
}
/*定义普通类去实现这个接口*/
Class Girl implements Student{
public void show(){
System.out.println("我自己的名字叫chx");
}
}