如何曲线救国,调用抽象类的构造方法创建对象?

抽象类的知识点总结:

1.抽象类 不可以实例化对象(因为抽象类中会有可能有抽象方法)

如果该抽象类可以创建对象,则会有可能调用抽象方法,但是因为抽象方法没有方法体(我们说调用方法的目的就是为了使用他的方法体的功能)

此时没有意义.......那我们为了解决问题,只能反推出假设错误.即就是说该从抽象类中不能创建对象,

2. 有抽象方法的类一定是一个抽象类,但是抽象类不一定有抽象方法

 

3.抽象类一定是一个父类.

(因为抽象类没有办法实例化所有,只能通过子类继承后实例化,具体子类如何实现抽象父类的实例化呢????抽象类的子类要完全继承后再重写父类的所有的抽象方法才能实例化,如果没有全部的重写,则盖子类仍然是一个抽象类)

 

正文:

package abstractClass;

//父类:

public  abstract class Person {
    public String  name ;//属性
    public int age;//属性

    public  Person(){
        System.out.println("Person的一个烦人的构造");
    }//构造

    //public void eat(){
    //    System.out.println("Person吃饭的行为");
    //}//普通方法 ,此时该方法体没有任何意义,该父类被子类继承后方法都要重写,不使用父类的行为
    //    public  abstract void run();
    public  abstract void eat();//父类中的一个吃的抽象方法
    //没有方法体{},并且权限修饰符合void之间还有abstract,该方法就是一个抽象方法,
    //    这个方法在Person类中,所以该Person类也就是一个抽象类.
}

//===============================================

Teacher类:(子类)

class Teacher extends Person{//Teacher就是一个内部类,这儿的 teacher继承Person
    public  Teacher (){//备注:这个构造不是继承下来的,我可以理解为是调用,怎么调用呢???
        super ();// 
        System.out.println("我是在Teacher里滥竽充数的");
        //======有1 ,就调用有参数的构造,没有1 就调用无参数的构造.
    }
    @Override
    public void eat(){
        System.out.println("买菜自己做美食");
    }
    public void assignHomeWork(){
        System.out.println("老师布置作业");
    }
}
//================================================================

学生类:(子类)

class Student  extends Person{

    @Override
    public void eat(){
        System.out.println("回家,帮助妈妈做饭,然后与爸爸妈妈一起吃顿饭");
    }
    public void doHomeWork(){
        System.out.println("吃完饭,然后在爸爸妈妈的身边写作业");

    }
}

---------------------------------------------------------------------------------------------

测试类:

package Final.demo02;

public class Test {
public static void main (String []args){
//    Person p = new Person();//  报错Cannot instantiate the type Person 
//    不能通过new来创建新的对象,因为他是一个抽象类
//    p.name ("爸爸 ");//  报错The method name(String) is undefined for the type Person
//    既然都创建不了对象,那么肯定就也不能调用对象的name属性
    Teacher  tea = new  Teacher ();//Person的一个烦人的构造\我是在Teacher里滥竽充数的
    tea.eat();//买菜自己做美食
    tea.assignHomeWork();//老师布置作业
        //Teacher是一个Person的子类,而且被重写了,所以可以实例化,因此他可以创建对对象                                                                                                                                                                                                                                                                                                                                                                                                                                           
    Student stu =new Student();////Person的一个烦人的构造
    stu.eat();//回家,帮助妈妈做饭,然后与爸爸妈妈一起吃顿饭
    stu.doHomeWork();//吃完饭,然后在爸爸妈妈的身边写作业
    
}
}
//总结:在初步学习的时候,我们知道抽象类的构造方法是不能用创建对象来调用 的
//而且在我们学了继承以后,乍眼一看,构造函数既然也不能被继承,那我们怎么在他类中去调用构造呢?
//-------这儿我们需要综合抽象类 还有java继承性的知识 去曲线救国.
/*思路分析:
    既然我们不能名明目张胆的给构造函数在test类中利用创建对象的方法来调用构造,
    既然任何一个抽象类都一定可以作为一个父类,
    那我们就在抽象类的本类中创建一个新的类,让这个新的类作为抽象类(父类)的子类,
    我们在test里面new一个子类的对象,new出这个子类的对象的同时 也就实现了让子类实例化   ,
    而我们知道子类对象实例化的时候,就是调用子类的构造方法,
    调用子类的构造方法的时候,默认先要调用父类的无参数的构造函数,
    此时,抽象类中的构造方法便被得以调用.打印出"Person的一个烦人的构造".

 

 

你可能感兴趣的:(每日定课)