五(十五)、abstract & 他的匿名子类
abstract关键字使用
1.abstract:抽象的;
2.abstract可以用来修饰的结构:类 方法
3.abstract修饰类:抽象类
此类不能实例化
抽象类中一定有构造器;便于子类对象实例化的时候调用(涉及子类对象实例化的全过程)
开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作;
4.abstract修饰方法:抽象方法
抽象方法只有方法声明,没有方法体
包含抽象方法的类,一定是一个抽象类;,反之,抽象类可以没有抽象方法;
若子类重写了父类中的所有抽象方法(不光是直接父类,还有间接父类)后,此子类方可实例化;
若子类没有重写了父类中的所有抽象方法(不光是直接父类,还有间接父类)后,则此子类也是一个抽象类,
需要使用abstract修饰
5.使用注意点:
a.abstract不能用来修饰:属性、构造器;
b.abstract 不能用来修饰私有方法、静态方法,final的方法;
1 public class Day15Abstract6 { 2 public static void main(String[] args) { 3 //不可被实例化 4 // Persons7 p1 = new Persons7(); 5 // p1.eat(); 6 } 7 } 8 abstract class Persons7{ 9 String name; 10 int age; 11 int id = 1001;//身份证号 12 13 public Persons7() { 14 } 15 public Persons7(String name, int age) { 16 this.name = name; 17 this.age = age; 18 } 19 20 public void eat() { 21 System.out.println("吃饭"); 22 } 23 24 //抽象方法,只有方法的声明,没有方法体; 25 public abstract void eat1(); 26 27 public void walk() { 28 System.out.println("走了"); 29 } 30 } 31 class student7 extends Persons7{ 32 33 @Override 34 public void eat1() { 35 // TODO Auto-generated method stub 36 System.out.println("学生多吃有营养的"); 37 } 38 39 }
抽象类的匿名子类:
1 public class Day15AnonymousSubClass10 { 2 public static void main(String[] args) { 3 method(new Student());//匿名对象 4 Worker worker = new Worker(); 5 method1( worker);//非匿名的类的非匿名的对象 6 method1(new Worker());//非匿名的类的匿名对象 7 Persons7 p = new Persons7() {//创建了一匿名子类的对象 8 9 @Override 10 public void eat1() { 11 // TODO Auto-generated method stub 12 13 } 14 15 }; 16 17 method1(new Persons7() {//创建了一匿名子类的匿名对象 18 19 @Override 20 public void eat1() { 21 // TODO Auto-generated method stub 22 23 } 24 25 }); 26 } 27 28 public static void method(Student s) { 29 30 } 31 public static void method1(Persons7 p) { 32 p.eat1(); 33 p.walk(); 34 } 35 36 37 } 38 class Worker extends Persons7{ 39 40 @Override 41 public void eat1() { 42 43 } 44 45 }
补充:抽象类和接口都不能实例化,都可以有匿名子类;
面试题:抽象类不能被实例化 但为什么可以有构造器?
答:抽象类中一定有构造器;便于子类对象实例化的时候调用(涉及子类对象实例化的全过程)
博客园地址:https://www.cnblogs.com/lixiuming521125/