当前位置:编程学习 > JAVA >>

java中为什么子类仍然可以通过继承公共方法访问父类的私有变量?

代码如下:
public class Inte易做图ces {
    public static void main(String[] args) {
        Dog d = new Dog(3);
        d.enjoy();
        Valueable v = (Valueable)d;
        System.out.println(d.valueable());
        d.setname("aaaa");
        System.out.println(d.getname());
        System.out.println(d.getf()+"\n");

    }
}

inte易做图ce Valueable {
    public int valueable();
}
inte易做图ce Protectedable {
    public void protectedable();
}

abstract class Animal{
    private String name;

    abstract void enjoy();
    public void setname(String name) {
        this.name = name;
    }
    public String getname(){
        return this.name;
    }
}

class Dog extends Animal implements Valueable,Protectedable {
    private int age;

    Dog(int age){
        this.age = age;
        //this.name = name;
    }

    public void enjoy() {
        System.out.println("狗叫");
    }
    public int valueable() {
        return 100;
    }
    public void protectedable() {
        System.out.println("值钱的东西");
    }
    public String getf() {
        return super.getname();
    }
}

那子类 d对象里面有没有 name 属性? 不然访问的name 是从哪里来的?
搞不明白了... --------------------编程问答-------------------- java中子类本来就可以通过继承公共方法访问父类的私有变量啊,

就算不是父子关系,一个类也可以通过另一个类的公共方法访问它的私有变量了。。。。
像我们经常用的实体Bean都是这么实现的啊,,,,,


--------------------编程问答-------------------- 子类是访问了父类的方法,记住是方法而不是属性

父类的方法操作了私有属性,这跟子类没有任何关系 --------------------编程问答-------------------- 但一般的那个 是 先New出来的对象,之后用对象的getname,取得name的值 那个name值是对象的属性啊  现在子类继承之后 Name没有怎么 调用的啊 --------------------编程问答-------------------- 这不就是封装的目的么? --------------------编程问答--------------------
引用 3 楼 skmtpsh 的回复:
但一般的那个 是 先New出来的对象,之后用对象的getname,取得name的值 那个name值是对象的属性啊  现在子类继承之后 Name没有怎么 调用的啊
那个 name 不是它的。如果是它的,它就可以调用了。

class Dog extends Animal implements Valueable,Protectedable { 
    private int age; 

    Dog(int age){ 
        this.age = age; 
        this.name = "aaaa"; 
    } 

    public void enjoy() { 
        System.out.println("狗叫"); 
    } 
    public int valueable() { 
        return 100; 
    } 
    public void protectedable() { 
        System.out.println("值钱的东西"); 
    } 
    public String getf() { 
        return super.getname(); 
    } 

代码中的红色部分编译不让通过,就是说子类没有 name 属性,它无权调用。 --------------------编程问答-------------------- 既然提供了public的方法去访问私有变量,说明可以间接地访问私有变量,但是直接访问是不行的 --------------------编程问答-------------------- 这个问题不要回答了吧,慢慢理解就行了。 --------------------编程问答-------------------- 围                观!!!!!!!!!!!!!!!!!!! --------------------编程问答-------------------- 是不是可以这样 理解呢 你对父类的这个方法只有查看的权限 没有修改的权限呢?! --------------------编程问答--------------------
引用 9 楼 c5153000 的回复:
是不是可以这样 理解呢 你对父类的这个方法只有查看的权限 没有修改的权限呢?!

不一定的,父类如果有setName方法,就可以修改了 --------------------编程问答-------------------- java的子类有一个隐含的父类的对象的引用。在调用d.setName()方法时,d自动向上转型成了Animal,所以这里调用的是Animal的setName方法,Animal的方法当然能访问它自己的私有属性啊。另一方面Animal类将属性name封装了起来,子类并不能看见这个属性,但Animal类通过一个公有方法使子类可以操作这个属性。不知道我理解的对不对。 --------------------编程问答-------------------- 基础问题都弄不懂,悲哀! --------------------编程问答-------------------- 基础啊。基础很重要。 --------------------编程问答-------------------- 父类的任何私有成员变量其实是被子类继承的,这些继承来的成员对子类虽然不可见,但是可以通过
父类的方法去操作他们。我的博客上有篇文章,希望可以帮到你 --------------------编程问答-------------------- 我也是11楼这样认为的、

多态么? --------------------编程问答-------------------- 子类能访问父类公共方法,但是不能访问父类私有属性 --------------------编程问答-------------------- javaBean理解清楚这个就不难了. --------------------编程问答-------------------- 基础    继承 是继承父类 所有的方法方法属性  除去private 修饰的
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,