抽象
用abstract修饰方法则为抽象方法,包含抽象方法的类为抽象类,子类必须实现抽象方法;(定义规范)
1.有抽象方法的类只能定义成抽象类
2.抽象类不能实例化,既不能用new来实例抽象类
3.抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
4.抽象类只能用来被继承
5.抽象方法必须被子类实现
package com.bhzt.abstracttest;
/**
* 抽象
*/
public abstract class Animal {
abstract public void shout();
}
package com.bhzt.abstracttest;
public class Dog extends Animal {
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
接口
定义的一组规范
可以更加规范的对子类进行约束,将规范和具体实现分离
说明:
1.访问修饰符:只能是public(默认即为public)
2.一个接口可以继承多个接口,一个子类可以实现多个接口
3.属性只能是常量,用public static final修饰(默认即为)
4.接口中的方法只能是,public abstract(默认即为)
5.接口不能创建实例
6.一个类实现了接口,必须实现接口中所有的方法,并且这些接口只能是public
7.JDK1.8之前,接口中只能包含静态常量、抽象方法,JDK1.8及以后接口中包含了普通的静态方法、默认方法
普通类:具体实现
抽象类:具体实现、规范(抽象方法)
接口:JDK1.8以前是纯规范,JDK1.8及以后版本定义静态方法和默认方法
package com.bhzt.interfacetest;
/**
* 动物接口
*/
public interface Animal {
String defense="防御";//默认省略了 public static final
void shout();//默认省略了 public abstract
/**
* JDK1.8及以后版本支持接口定义默认方法
*/
default void move(){
System.out.println("我是如何移动的");
}
}
package com.bhzt.interfacetest;
/**
* 吃
*/
public interface Eat {
void food();
/**
* JDK1.8及以后版本支持接口定义静态方法
*/
public static void howEat()
{
System.out.println("如何吃");
}
}
package com.bhzt.interfacetest;
/**
* 接口多继承
*/
public interface LandAnimal extends Animal,Eat {
void live();
}
package com.bhzt.interfacetest;
public class Dog implements Animal,Eat {
@Override
public void shout() {
System.out.println("汪汪汪");
}
@Override
public void food() {
System.out.println("吃骨头");
}
@Override
public void move() {
System.out.println("陆地上用四肢移动");
}
public static void howEat()
{
System.out.println("用锋利的牙齿撕碎食物");
}
}
package com.bhzt.interfacetest;
public class Cat implements LandAnimal {
@Override
public void live() {
System.out.println("有的流浪,有的被当做宠物");
}
@Override
public void shout() {
System.out.println("喵喵喵");
}
@Override
public void food() {
System.out.println("吃鱼");
}
}
package com.bhzt.test;
import com.bhzt.interfacetest.Dog;
import com.bhzt.interfacetest.Eat;
import com.bhzt.polymorphism.Animal;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class DogTest {
@Test
void shout() {
}
@Test
void move(){
Dog d=new Dog();//接口的默认方法,必须创建子类的对象 并实现方法后调用
d.move();
}
@Test
void food() {
}
@Test
void howEat(){
Eat.howEat();//接口的静态方法可以直接调用
Dog.howEat();
}
}