Java4Andriod 从零学起 ---learn3

super ; 函数的复写 ; 对象的转型


super:

class Person{
    String name ;
    int age ;

    Person(){
        System.out.println("Person的无参数构造函数");
    }

    Person(String name , int age){
        this.name = name ;
        this.age = age;
        System.out.println("Person的两个参数构造函数,他们是"+this.name+"和"+this.age);
    }

    void eat(){
        System.out.println("我是eat!");
    }
}

class Student extends Person{
    int grade ;

    Student(){
        super();//如果不写这句的话,系统就会自动加上这句话 , 与this一样,必须为函数的第一个语句
        System.out.println("Student的无参数构造函数");
    }

    Student(int grade){
        this() ; //调用本类中的其他构造函数
        this.grade = grade ;
        System.out.println("Student有grade="+this.grade+"为参数的构造函数");
    }

    Student(String name , int age , int grade){
        //this.name = name;
        //this.age = age;
        super(name , age);  //根据参数的不同,调用父类中的构造函数 , 减少了重复代码
        this.grade = grade ;
        System.out.println("Student调用了父类构造函数的构造函数");
    }

}

//在子类中,必须调用父类的构造函数即super() , 因为这样会减少重复代码的出现
//this() 和 super() 不能一起使用,因为他们两个都必须加在构造函数的第一句,会冲突 
---------------------------------------------

函数的复写:

class Person2{
    String name ;
    int age;

    void introduce(){
        System.out.println("我的姓名是"+this.name+"我的年龄是"+age);
    }

}

//复写(override):
//1.在具有父子类关系的两个类中
//2.在子类中函数与父类完全相同(返回值,参数)

class Student2 extends Person2{
    String address;

    void introduce(){  //这个就是函数的复写,它覆盖了原来Peron2中的introduce()
        super.introduce();  //super就相当于对父类的this
        System.out.println("我的地址是"+address);
    }
}
------------------------------------------------

对象的转型:

class Test2{
    public static void main(String args []){

        Student2 s1 = new Student2();
        s1.name = "Owen";
        s1.age = 20;
        s1.address = "Beijing";
        s1.introduce();

        Person2 p1 = new Person2();
        p1.name = "Owen" ;
        p1.age = 20;
        p1.introduce();
//----------------------------------------------------------------------------
        //对象的转型(两个类必须满足继承关系)-->有点像C语言中的强制转换

        //向上转型(上转)
        //1.一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型
        //2.一个引用能够调用哪个方法,取决于这个引用所指的对象
        System.out.println("----下面是对象的转型相关内容-----");

        Student2 s = new Student2();
        Person2 p = s;  //向上转型
        //这样也可以: Person2 p = new Student2();

        p.name = "成爷";
        p.age = 20;
        //p.address = "北京"       -->Person2 会报错,因为person中没有address变量
        p.introduce();   //调用的是Student2中的复写过的introduce (就是Student2真的覆盖了Person2)

        //向下转型(先上转,再下转)
        //为了保证他们是相同的类型
        //

        Person2 pp = new Student2();
        Student2 ss = (Student2)pp;
        //Person2 pp = new Person2(); Student2 ss = (Student2)pp;  这样是不行的,因为无法保证pp可转

    }
}

为什么要进行对象的转型?

向上转型:   转型后,调用的方法,是复写过的方法(子类的方法); 成员变量, 是父类的成员变量(父类的变量);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值