抽象类和抽象方法
抽象类
abstract修饰类
如abstract class Person{},Person为抽象类,此类不能实例化,即不能new对象。
类中一定有构造器的,包括抽象类,便于子类实例化时调用;
开发中通常会提供抽象类的子类,让子类对象实例化,完成相关操作
abstract修饰方法
抽象方法,只有方法的声明,没有方法体,如public abstract void eat();
抽象方法所在的类一定是抽象类,反之,抽象类里可以没有抽象方法
抽象方法没有具体的实现,不能被调用
public abstract 返回值类型 方法名(参数);
abstract不能用来修饰属性,构造器等结构;
abstract不能用来修饰私有方法,父类中有抽象方法,子类继承父类后,可以有两种解决办法,一种子类里也继承了父类抽象方法,子类要声明为抽象的,但也代表着不能创建对象,就不能说面向对象的,这种一般不用;另一种,子类重写父类中的抽象方法,子类可以实例化,这时方法若写成private的,不认为这方法能被重写
abstract不能修饰静态方法,final的方法。静态方法一般通过”类名.方法名“去调用,方法有方法体,而abstract修饰的方法抽象,没有方法的实现,需要子类重写,而由static修饰的方法不看做重写方法。final修饰的方法不能被重写
所以说,abstract不能和private,static,final这些关键字同时出现
抽象类中可以定义构造器,虽然不能创建对象,但是子类继承之后创建对象,还要用到构造器,还要加载属性,方法。
匿名对象
public class PersonTest {
public static void main(String[] args) {
Worker worker = new Worker();
method(worker); //非匿名类非匿名对象
method(new Worker()); //非匿名类匿名对象
//创建了一匿名子类的对象
//没了多态特性,抽象类无多大意义
Person2 person = new Person2() {
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void breath() {
System.out.println("好好呼吸");
}
};
}
public static void method(Person2 p){
p.eat();
p.breath();
}
}
abstract class Person2{
String name;
int age;
public Person2() {
}
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
public abstract void breath();
}
class Worker extends Person2{
@Override
public void eat() {
}
@Override
public void breath() {
}
}