第五章 继承(1)

文章详细讲述了Java中继承的使用,子类重写父类方法、多态的体现,抽象类的定义及其注意事项,以及自动装箱与拆箱的概念及其在比较中的行为。
摘要由CSDN通过智能技术生成

继承实现的几个点:

        子类通过extends继承父类;

        P p = new Sub(),这种声明方式是多态的一种体现。子类sub重写父类P方法时,调用的是子类重写后的方法。P不能访问子类的getComplay()方法。

public class Main {

    public static void main(String[] args) {
        // 子类赋给超类,P定义是People类,所以它不能使用Employee的私有变量camplay
        People p = new Employee();
        p.setAge(10);
        p.setName("James");
        System.out.println("age: "+ p.getAge() + " name: "+ p.getName() + " className :"+p.getClass().getName() + " test方法: " + p.test());
        Employee e = new Employee();
        e.setCanplay("SN");
        e.setAge(20);
        e.setName("kobe");
        System.out.println("age: "+ e.getAge() + " name: "+ e.getName() + " complay: " + e.getCanplay() +  " className :"+e.getClass().getName() + " test方法: " + p.test());
        // 子类对象赋给超类
        p = e;
        System.out.println("age: "+ p.getAge() + " name: "+ p.getName() +  " className :"+e.getClass().getName() + " test方法: " + p.test());
    }
}

class People{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    protected String test(){
       return  "父类方法test()";
    }
}
class Employee extends People {
    private String canplay;

    public String getCanplay() {
        return canplay;
    }

    public void setCanplay(String canplay) {
        this.canplay = canplay;
    }
    public String test(){
       return "子类方法test()";
    }
}

/*age: 10 name: James className :Employee test方法: 子类方法test()
age: 20 name: kobe complay: SN className :Employee test方法: 子类方法test()
age: 20 name: kobe className :Employee test方法: 子类方法test()*/

若是父类的方法不想被子类重写修改,可以使用final修饰符标记父类方法。


抽象类

        abstract修饰的类称为抽象类。有几点需要注意:

        1、抽象类可以没有抽象方法;

        2、抽象方法的声明与普通方法不一样,抽象方法不具备方法体;

        3、子类继承抽象类,必定要实现抽象类中的抽象方法,且需要@Override注解标记子类方法。

public class Main {

    public static void main(String[] args) {
        // 子类赋给超类,P定义是People类,所以它不能使用Employee的私有变量camplay
        People p = new Employee();
        System.out.println(p.getStr()); // hello
    }
}

abstract class People{
    public  String test(){
       return  "父类方法test()";
    }

    public abstract String getStr();
}
class Employee extends People {

    @Override
    public String getStr() {
        return "hello";
    }
}

自动装箱与拆箱

        每一个基本类型都有一个与之对应的包装类,例如int与Integer,long与Long,boolean与Boolean等。

public static void main(String[] args) {
       int n = 3;
       Integer m = new Integer(3);
       System.out.println(n == n); // true
       int i = 300;
       Integer j = new Integer(300);
        System.out.println((i == j)); // false
       Integer a = 300;
       Integer b = new Integer(300);
       System.out.println("a : "+ System.identityHashCode(a) + " b:"+ System.identityHashCode(b)  + " 比较结果 : " + (a == b)); // false
       Integer c = 3;
       Integer d = new Integer(3);
        System.out.println("c : "+ System.identityHashCode(c) + " d:"+ System.identityHashCode(d)  + " 比较结果 : " + (c == d)); // false
       Integer e = 3;
       Integer f = 3;
        System.out.println("e : "+ System.identityHashCode(e) + " f:"+ System.identityHashCode(f)  + " 比较结果 : " + (e == f)); // true
       Integer h = 300;
       Integer k = 300;
        System.out.println("h : "+ System.identityHashCode(h) + " k:"+ System.identityHashCode(k)  + " 比较结果 : " + (h == k)); ; // false
    }

/*输出结果:
true
true
a : 1209271652 b:93122545 比较结果 : false
c : 403424356 d:321142942 比较结果 : false
e : 403424356 f:403424356 比较结果 : true
h : 745160567 k:610984013 比较结果 : false
*/

        如上述代码所示,n/m,i/j之间的比较是int与Integer的比较涉及到了自动拆装箱之间的转换,-128 ~ 127之间的数会存在与缓存池中, 所以e和f对应的地址值是同一个,对象的比较结果也为true,其他通过new出来的对象之间的比较都是FALSE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值