抽象类
1、为什么需要抽象类?
因为在多态的前提下,父类的方法体始终是冗余的,即永远不会被执行
2、抽象类是什么?
没有方法体的方法为抽象方法,含有抽象方法的类为抽象类(abstract修饰)
抽象类:
package sun;
public abstract class Mammal {//abstract修饰的类为抽象类
public void eat() {//抽象类中可以有具体的方法
System.out.println("正在吃......");
}
public Mammal(int age){//抽象类中可以定义构造方法
}
public abstract void move();//抽象方法没有方法体
}
抽象类的实现类:
package sun;
public class Whale extends Mammal{
@Override //对抽象方法重写
public void move() {//实现抽象类中的抽象方法
System.out.println("靠鳍移动......");
}
}
测试类:
package sun;
public class Test {
public static void main(String[] args) {
Mammal mammal = new Whale();
mammal.move();//抽象类中的抽象方法(在子类中被实现)
mammal.eat();//抽象类中的普通方法
//Mammal m = new Mammal(); 抽象类不能创建对象
}
}
注:抽象类的特点
1、如果类中含有抽象方法,则该类必须为抽象类,即abstract修饰所修饰的类
2、抽象类中可以没有抽象方法
3、抽象类不能创建对象
4、抽象类中的抽象方法必须由子类实现(重写);子类如果没有实现全部或部分父类中的抽象方法,则这个子类也必须为抽象类
5、抽象类中可以有具体的方法
6.抽象类中虽然不能创建对象,但是可以定义构造方法,也可以定义普通的方法,该方法均用于子类调用
7、抽象类不能被final修饰
结果:
靠鳍移动......
正在吃......
接口
1、什么是接口?
抽象类中可以包含任意合法的方法,可以包含任意合法的成员变量;
但如果一个抽象类中有且只有抽象方法,则该抽象类可以定义为接口。
2、怎么定义接口?
接口类使用interface关键字定义接口;
实现类通过implements关键字定义,来实现该接口的抽象方法
接口:
package sea;
public interface IMammal extends I,II{//(I、II为另外两个接口)普通类只能单继承,但接口可以多继承多个接口
int age = 20;//此处省略了public static final
void move();//此处省略了public abstract
//JDK8即以后的版本,可以定义多个default或static修饰的具体方法
public static void eat() {
System.out.println("正在吃......");
}
public default void breath() {
System.out.println("正在呼吸......");
}
}
接口的实现类:
package sea;
public class Whale implements IMammal{
@Override
public void move() {//对接口中抽象方法的实现
System.out.println("靠鳍游动......");
}
}
测试类:
package sea;
public class Test {
public static void main(String[] args) {
IMammal mammal = new Whale();
mammal.move();
IMammal.eat();//接口中定义的static修饰的具体方法,可以直接通过接口名调用
// System.out.println(IMammal.age); 可以直接用类名调用,说明是static
// IMammal.age = 30; 不能被重新赋值,说明是final
}
}
注:接口的特点
1、一个类没有实现完接口的所有方法,则该类必须定义为抽象类(abstract)
2、接口不能创建对象,且接口中没有构造方法
3、接口名常常以I开头
4、接口中抽象方法默认为public abstract,所以接口中定义抽象方法时可以省略public abstract
5、抽象类中可以定义任意合法的成员变量;但是接口中只能定义public static final常量(可省略)
6、JDK8以前版本中,接口只能含有常量和抽象方法;JDK8即以后的版本,可以定义多个default或static修饰的具体方法
7、Java中类只能继承一个父类;但是Java中接口可以继承多个接口,每个接口之间使用逗号间隔
结果:
靠鳍游动......
正在吃......
抽象类与接口的区别总结
区别:
抽象类 接口
1、定义 abstract interface
2、构造方法 有 无
3、继承 只能单继承 可以继承多个接口
4、实现 extends implements
5、成员变量 可以定义任意合法的成员变量 只能定义public static final修饰的常量
6、方法 可以定义任意合法的方法 只能定义抽象方法(JDK8即以上可以定义多个static或default修饰的方法)
注:
定义接口的抽象方法时,可以省略public abstract
定义接口的常量时,可以省略public static final