1、什么是抽象类?
抽象类是被abstract修饰的类,抽象类不能被实例化。抽象类是用来被继承的。
抽象的意义:如果没有多态,抽象就没有意义,因为抽象类无法实例化,但可以通过父类引用指向子类对象。
2、什么是匿名 与 为什么要使用匿名?
为了省事,为了方便,有时候我们只需要使用一次实例化的类,因此省去给实例化的类搞个名字。比如有个类叫做Person,该类有个方法是show(),我们可以直接通过 new Person().show() 来调用该方法,而省去给该实例化的类赋一个对象名。
3、抽象类的匿名子类的四种情况
1.非匿名类的匿名对象 有类名,无实例化的对象名
2.非匿名类的非匿名对象 有类名,有实例化的对象名
3.匿名子类的非匿名对象 无子类名,有实例化的子类对象名
4.匿名子类的匿名对象 无子类,无实例化的子类对象名
4、Code
abstract class Person{ //抽象类:不能实例化
public abstract void run();
public abstract void eat();
}
class Men extends Person{
@Override
public void run() {
System.out.println("男人:跑步");
}
@Override
public void eat() {
System.out.println("男人:吃饭");
}
}
class Women extends Person{
@Override
public void run() {
System.out.println("女人:跑步");
}
@Override
public void eat() {
System.out.println("女人:吃饭");
}
}
public class AbstractTest {
public static void main(String[] args) {
AbstractTest abstractTest=new AbstractTest();
Men men=new Men();
abstractTest.method(men);;//1、非匿名类的非匿名对象(类名:Men 对象名:men)
abstractTest.method(new Women());//2、非匿名类的匿名对象(类名:Women 对象名:无)
Person person=new Person() { //3、匿名子类的非匿名对象(子类名:无 对象名:person)
//相当于用抽象类指向子类对象,但此时不知道哪个子类,因此需要重写
//所以借助子类重写方法来实现方法的调用。
@Override
public void run() {
System.out.println("跑步");
}
@Override
public void eat() {
System.out.println("吃饭");
}
};
method(person);
abstractTest.method(new Person() { //4、匿名子类的匿名对象(子类名:无 对象名:无)
//最简便的写法,连子类名都没有了
@Override
public void run() {
System.out.println("跑步");
}
@Override
public void eat() {
System.out.println("吃饭");
}
});
}
public static void method(Person p) {
p.eat();
p.run();
}
}