A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Demo4_Extends {
    public static void main(String[] args) {
        //System.out.println("Hello World!");
        //Son s = new Son();
        //Son s = new Son("s");
        //s.show();
        //s.print();
        //Son s1 = new Son();
        //s1.print();                                        //同父类同名的子类的成员方法
        //s1.method();
        //s1.print();
        //System.out.println(s1.getName()+"..."+ s1.getAge());

        //Son s2 = new Son("Son",1);                        //调用子类有参构造
        Son s2 = new Son("Son");                            //调用子类有参构造的重载

        //System.out.println(s2.getName()+"..."+ s2.getAge());
    }
}

/*
class Father{
    public void show() {
        System.out.println("父类");
    }
}

class Son extends Father{
}
*/




/*
* 继承的注意事项
    * a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
    * b:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
    * c:不要为了部分功能而去继承
    * 项目经理 姓名 工号 工资 奖金
    * 程序员    姓名 工号 工资
* 什么时候使用继承
    * 继承其实体现的是一种关系:"is a"。
        Person
            Student
            Teacher
        水果
            苹果
            香蕉
            橘子
            
    采用假设法。
        如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
*/
/*
class Father{
    private String name;                                        //私有成员变量无法继承
    private void show() {                                        //私有成员方法无法继承
        System.out.println("父类");
    }
}

class Son extends Father{
}
*/





/*
* 使用变量遵循一个“就近原则”。局部位置有就使用,没有就去本类的成员位置找,有就使用;没有就去父类的成员位置找,有就使用,没有就报错
* a:不同名的变量
* b:同名的变量
*/
/*
class Father{
    int num1 = 10;
    int num2 = 30;
}

class Son extends Father{
    int num2 = 20;                                                
    public void print() {
        System.out.println(num2);                                //就近原则,子类有就不用父类的
        System.out.println(num1);                                //子类无就去继承父类的
        System.out.println(num3);                                //父类也无,就报错
    }
}
*/





/*
* this和super都代表什么
    * this:代表当前对象的引用,谁来调用我,我就代表谁
    * super:代表当前对象父类的引用
* this和super的使用区别
    * a:调用成员变量
        * this.成员变量  调用本类的成员变量,也可以调用父类的成员变量
        * super.成员变量 调用父类的成员变量
    * b:调用构造方法
        * this(...)         调用本类的构造方法
        * super(...)     调用父类的构造方法
    * c:调用成员方法
        * this.成员方法  调用本类的成员方法,也可以调用父类的方法
        * super.成员方法 调用父类的成员方法
*/
/*
class Father{
    int num1 = 10;
    int num2 = 30;
    private int num3 = 50;                                    //父类中私有成员变量
}

class Son extends Father{
    int num2 = 20;                                            //子类中同父类中同名的成员变量                           
    public void print() {
        int num2 = 40;                                        //本类成员方法中的局部变量,this不会调用,this调用的是本类成员变量(成员方法外),本类无,加载父类,父类也无,就报错,不会调用方法中的局部变量
        System.out.println(this.num2);                        //本类有时,this调用本类成员变量,this指代的是创建的Son类的对象
        System.out.println(this.num1);                        //本类无时,this调用父类成员变量
        System.out.println(super.num2);                        //本类有时,super仍调用父类成员变量
        //System.out.println(super.num3);                    //即便用super也无法继承父类私有成员变量
    }
}
*/




/*
* 子类中所有的构造方法(空参和有参)默认都会访问父类中空参构造方法
* 为什么呢?
    * 因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化。
    * 每一个构造方法的第一条语句默认都是:super();, Object类是最顶层的父类。
*/
/*
class Father{
    public Father() {
        //super();                                            //继承Object类
        System.out.println("Father的空参构造方法");                        
    }

    public Father(String s) {
        //super();                                                   
        System.out.println("Father的有参构造方法");                        
    }
                        
}

class Son extends Father{                                            
    public Son() {
        //super();                                            //这是一条语句,如果不写,系统会默认加上,用来访问父类中的空参构造
        System.out.println("Son的空参构造方法");            //父类先完成初始化,子类再进行初始化
    }

    public Son(String s) {
        //super();                                                   
        System.out.println("Son的有参构造方法");                    
    }
}
*/


/*
class Father{
    private String name;
    private int age;
    public Father() {
        System.out.println("Father的空参构造方法");                        
    }

    public Father(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Father的有参构造方法");                        
    }
            
    public void setName(String name) {                                    //设置姓名
        this.name = name;
    }

    public String getName() {
        return name;                                                    //获取姓名
    }

    public void setAge(int age) {                                        //设置年龄
        this.age = age;
    }

    public int getAge() {                                                //获取年龄
        return age;
    }


}

class Son extends Father{                                            
    public Son() {
        System.out.println("Son的空参构造方法");                        
    }

    public Son(String name,int age) {
        System.out.println("Son的有参构造方法");                    
    }
}

*/

/*
//父类中仅定义了有参构造,无空参构造时,子类直接继承时会报错
//由于定义了父类的有参构造,空参又未写,系统此时不会在父类中创建空参构造
class Father{
    private String name;
    private int age;
    //public Father() {
    //    System.out.println("Father的空参构造方法");                        
    //}
   
    public Father(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Father的有参构造方法");                        
    }
}

class Son extends Father{                                            
    public Son() {
        System.out.println("Son的空参构造方法");                        
    }

    public Son(String name,int age) {
        System.out.println("Son的有参构造方法");                    
    }
}
*/





/*
//父类中无空参时super解决
class Father{
    private String name;
    private int age;
    //由于定义了父类的有参构造,空参又未写,系统此时不会在父类中创建空参构造
    public Father(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Father的有参构造方法");                        
    }

    public void setName(String name) {                                    //设置姓名
        this.name = name;
    }

    public String getName() {
        return name;                                                    //获取姓名
    }

    public void setAge(int age) {                                        //设置年龄
        this.age = age;
    }

    public int getAge() {                                                //获取年龄
        return age;
    }
}

class Son extends Father{                                            
    public Son() {
    //父类中无空参构造时可以通过super解决,法一:直接传值(不采用)
        super("Son1",2);                                                //super调用父类中的有参构造方法
        System.out.println("Son的空参构造方法");                        
    }

    public Son(String name,int age) {
    //父类中无空参构造时可以通过super解决,法二:传变量
        super(name,sge);
        System.out.println("Son的有参构造方法");                    
    }
}
*/



//父类无空参时this解决
//this只能出现在子类的空参构造中,相当于调用子类中的有参构造,前提是子类中的有参构造可以调用父类中的有参构造
class Father{
    private String name;
    private int age;
    //由于定义了父类的有参构造,空参又未写,系统此时不会在父类中创建空参构造
    public Father(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Father的有参构造方法");                        
    }

    public void setName(String name) {                                    //设置姓名
        this.name = name;
    }

    public String getName() {
        return name;                                                    //获取姓名
    }

    public void setAge(int age) {                                        //设置年龄
        this.age = age;
    }

    public int getAge() {                                                //获取年龄
        return age;
    }
}

class Son extends Father{                                            
   
    //public Son() {
    //父类中无空参构造时可以通过this控制
    //    this("Son2",3);                                                    //this调用本类中的有参构造方法
        //super("Son2",3);                                              //super调用父类中的有参构造方法
        //super();                                                        //默认有super();会去继承父类空参构造,而父类中无空参构造,故会报错
    //    System.out.println("Son的空参构造方法");                        
    //}

   
    //有参构造重载
    public Son(String name) {
        //this(name,4);                                                    //this调用本类中的有参构造方法
        super(name,5);                                                    //super调用父类中的有参构造方法
        System.out.println("Son的有参构造方法");                        
    }
   

    public Son(String name,int age) {
        //super();
        //this("Son3",4);                                                //this不该出现于此,错误: 递归构造器调用,子类去创建对象时,子类的构造方法(无参或有参),必须访问父类的空参构造方法
        //this(name,age);                                                
        super(name,age);                                                //目的是将系统默认super();覆盖
        System.out.println("Son的有参构造方法");                    
    }

   
    //public Son(String name,int age) {
    //    this("Son3",4);                                                    // this不该出现于此,错误: 递归构造器调用,子类去创建对象时,子类的构造方法(无参或有参),必须访问父类的空参构造方法
    //  super(name,age);
    //    System.out.println("Son的有参构造方法");                    
    //}
   
   
    //上面的代码相当于以下代码块,super();会访问父类的空参构造,而父类中只有有参构造,故会报错
    //public Son(String name,int age) {
    //    super();                                                        
        //this("Son3",4);                                                // 错误: 递归构造器调用,子类去创建对象时,子类的构造方法(无参或有参),必须访问父类的空参构造方法
        //super(name,age);
    //    System.out.println("Son的有参构造方法");                    
    //}
   
}


/*
class Father{
    public void print() {                                                
        System.out.println("父类成员方法");
    }


}

class Son extends Father{
    public void method() {                                                
        System.out.println("子类成员方法");
    }

    public void print() {
        super.print();                                                    //super调用父类同名成员方法
        this.method();                                                    //this调用本类成员方法
        System.out.println("同父类成员方法同名的子类成员方法");
    }
}

*/

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马