五(十五)、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
补充:抽象类和接口都不能实例化,都可以有匿名子类;
面试题:抽象类不能被实例化 但为什么可以有构造器?答:抽象类中一定有构造器;便于子类对象实例化的时候调用(涉及子类对象实例化的全过程)
我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。
版权声明
本文仅代表作者观点,不代表博信信息网立场。