五(十五)、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 }

补充:抽象类和接口都不能实例化,都可以有匿名子类; 

面试题:抽象类不能被实例化 但为什么可以有构造器?

答:抽象类中一定有构造器;便于子类对象实例化的时候调用(涉及子类对象实例化的全过程

posted @ 2020-08-06 21:27  啄木鸟伍迪  阅读(239)  评论(0编辑  收藏  举报
//火箭 GenerateContentList();