子类为什么不能直接调用父类的属性

子类为什么不能直接调用父类的属性,第1张

在集成的时候 父类的属性会被保护。如果想要调用父类的属性必须使用父类对象super 去调用 ,不然访问不了。你在子类中没有X的属性,所以在调用时使用this或super调用属性,这个时候不论是this还是super 调用的都是父类的X属性。

<p>父类不能调用子类的方法,子类方法是在子类中扩展出来的,而不是从父类继承而来的,但如果是覆盖父类方法,父类就可以调用。给你一个例子吧:</p>

public class a {

public void a();

}

public class b extends a {

@override

public void a();

public void b();

}<p>在这个例子中,b可以调用方法a()和b(),但a只可以调用方法a()。</p>

在Java的继承中,什么时候会出现调用子类的方法,父类的属性,没太明白你的意思,调用子类的方法,自己想调就可以,调用父类的属性,想调就调啊,这个随便啊,还是你是问 有继承,有多态的时候?

继承是类与类之间的关系,比如父类Animal,子类Dog从Animal继承,源文件为 Testjava :

class Animal { // 父类

public int i = 100; // 属性,也就是成员变量

public void run() {

Systemoutprintln("动物跑");

}

}

class Dog extends Animal { // 子类

@Override

public void run() {// 子类重写父类的方法run

Systemoutprintln("Dog四条腿跑");

}

}

public class Test {

public static void main(String[] args) {

// 调用父类属性a

Systemoutprintln(new Animal()i);

// 调用子类方法run

new Dog()run();

// 向上转型

Animal aa = new Dog();

Systemoutprintln(aai); // 调用父类属性a

aarun(); // 调用方法run

}

}

在父类中加个public方法,

如private $aaa = 'test';

public function getAAA(){

return $this->aaa;

}

在子类中调用parent::getAAA();就可以获得父类私有属性

当然如果你想获取多个,可以改成动态变量名,

getAAA($v){

return $this->{$v};

}

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。

你是想通过反射获得该类所有属性值或是给所有属性赋值吧。用getMethods获取所有的getter和setter方法,再取值或赋值。但不要用getDeclaredMethods,因为getMethods反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法;而getDeclaredMethods反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

这也许是框架注入属性值都采用setter注入的原因吧。

私有属性 谁都不可见 不能直接用 在子类中不可用

所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。

public class A {

private int a;

public int getA(){

return a;

}

public void setA(int a){

thisa=a;

}

}

public class B extends A{

private int b;

public int getB() {

return b;

}

public void setB(int b) {

thisb = b;

}

}

public class C extends B {

private int c;

public int getC() {

return c;

}

public void setC(int c) {

thisc = c;

}

}

那么当C c1=new C()时。c1可以使用setA()getA()访问控制从A类中继承来的私有属性a;

以上就是关于子类为什么不能直接调用父类的属性全部的内容,包括:子类为什么不能直接调用父类的属性、jsp页面上子类的对象要取父类属性的值怎么写、Java 中调用子类的方法和父类属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9585903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存