1.抽象
->可修饰方法和类的关键字。修饰方法之后方法不能有方法实现,而存在抽象方法的类同样需要用abstract修饰,就是抽象类
public abstract class Abstract {
//抽象方法
public abstract void method2();
}
1).抽象类中可以没有抽象方法
2).抽象类可以被继承,继承的子类如果不是抽象类必须重写全部抽象方法
3).抽象类不可以直接创建对象,可以使用多态声明父类创建子类对象
4).抽象类和实体类几乎完全一样,只是抽象类允许存在抽象方法
5).抽象类不能被final修饰
2.接口(Interface) -> 对于规则的抽象集合,由常量,抽象方法,默认方法,静态方法组成。其中默认方法和静态方法时JDK1.8之后才允许存在
public interface Animal {
//常量
int[] age = new int[100];
//抽象方法
void eat();
//默认方法
public default void move(){
System.out.println("我是个默认方法");
}
//静态方法
public static void add(){
System.out.println("我是个静态方法");
}
}
1).接口使用的时候需要其他类(抽象类和实体类)实现这个接口,如果实现接口的类不是抽象类,则必须实现所有的抽象方法。
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("猫去吃");
}
}
2).可以使用多态声明接口创建实现类对象
3).如果有多个类实现同一个接口且实现细节一样,可以在接口定义默认方法。可以通过实现该接口的类的实例直接调用
public class Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.move();
}
}
4).接口的默认方法可以被重写
5).一个类可以实现多个接口。
如果多个接口内的抽象方法名一样,则只需要重写一次。
如果默认方法名一样,则实现类必须重写这个方法。
如果该实现类的父类和接口内的默认方法名相同,默认使用父类的方法实现。
6).一个接口可以继承多个接口
public interface Animal {
}
public interface Animal2 {
}
public interface Animal1 extends Animal,Animal2{
}
7).接口中的静态方法可以通过接口名.方法名调用。(归属于接口本身)
继承时,可以通过子类名.静态方法去调用父类的静态方法。(不推荐,因为静态本身就是属于当前类本身,依旧建议使用父类名去调用)
实现时,不可以通过实现类名.静态方法去调用接口的静态方法。因为单继承多实现
8).接口中没有构造函数,没有成员变量,没有静态代码块。接口中定义的变量默认使用public static final修饰(常量),方法默认修饰符public abstract
9).匿名内部类,本质上是特殊的局部内部类
public interface Animal {
//获得名字
String getName();
}
public class Company {
public void add(Animal animal){
String name = animal.getName();
System.out.println("添加了一个"+name);
}
}
public class Main {
public static void main(String[] args) {
Company c = new Company();
//Company的add方法需要传入一个Animal对象。但Animal是接口,只能传入Animal的实现类实例
//如果这个实现类实例只打算使用一次,局部内部类是好的选择
class Dog implements Animal{
@Override
public String getName() {
return "Dog";
}
}
c.add(new Dog());
//因为实现类的对象只使用一次,所以类名可以省略,使用如下方式直接实现接口内的抽象方法即可,和上面代码一样功能
c.add(new Animal() {
@Override
public String getName() {
return "Dog";
}
});
}
}