java 类的继承

类的继承
 
     接触java这么久,经常用到其继承的特性进行类功能的拓展,但是到底继承是怎么工作的一直都没有弄明白.
     平时调试代码的时候发现继承的子类必须在调用构造函数之前调用父类的构造子(没有调用super函数的,jvm在实例化子类的时候会隐式调用),进行父类的初始化,当然了,这一点很容易理解,因为子类的构造子中有可能调用从父类继承过来的函数,而这些函数也就有可能去调用父类的属性,如果这个时候父类中的属性还没有初始化当然会产生意想不到的问题了.
     不过总觉得还是不够清晰,所以翻看了一下电子版的java编程思想. 作者Bruce Eckel在书中提到其实在子类中包含了一个父类的对象(我想应该叫 super吧),想想也是 ,要想在java中调用一个函数有两种方法,一个就是用对象名(普通函数),另外一个就是用类名(静态函数),而我们在子类中经常调用的是父类的普通方法,仔细想想也确实有道理,可是现在又有了一个新的问题,既然是两个包含的对象,他们之间属性的关系又是什么样的呢?不了解这个,我们在调用super.xxx()函数时有可能就达不到我们想要的效果了.
找个简单的例子验证一下
现有一个父类A:
class A
{
    private int test = 0;
    public void setTest(int test)
    {
        this.test = test;
    }
    public int getTest()
    {
        return this.test;
    }
}
和一个继承自它的子类B:
class B extends A
{
    public void printSuper()
    {
        System.out.println(super.getTest());
    }
}
 
在main函数中执行:
B b = new B();
b.setTest(10);
b.printSuper();
System.out.println(b.getTest());
时只是调用了B类对象b的setTest方法,应该说只是改变了b对象的test属性值
输出的结果发现父类和子类的test值都改成了10
 
我想java中确定了在子类中是没有办法访问继承而来的private属性和方法的,或许这个还是一个特例
于是我换了protected,public类型,不过测试结果和上面的没有什么改动
 
 
通过这些我们了解了通过继承而来的子类包含了叫super的直接父类对象,而且继承自而来的属性和父类的对应属性占用的是同一块内存(我们可以放心的使用super.xxx()函数来实现我们想要的功能,把该函数的操作看成是子类的函数调用就可以了),加上这个父类的对象也是private级别的,对于外界来说完全透明的说,所以我们使用起来感觉好像是直接写的包含两个类属性和方法的类一样.所以我们可以当成是普通的组合来使用,不同的是它复制了父类的接口,在实现面向接口编程时有很大的好处(类似实现接口)
类似于:
    public void printSet(Set set)
    {
        Iterator it = set.iterator();
        while (it.hasNext())
            System.out.println(it.next());
    }
 这样子,所有实现了Set接口的子类如:HashSet ,TreeSet的打印工作就不用分别提供函数了
只要传进来就可以了,因为参数的确切类型是在解释器执行代码的时候动态匹配的,所有增加了灵活性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值