java子类能继承父类属性吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java子类能继承父类属性吗?相关的知识,希望对你有一定的参考价值。
下面程序为什么输出12,而不是-6,想破脑壳都想不通,大神快救救我啊~~~
public class A
int i = 12;
class B extends A
int i = -6;
public static void main(String[] args)
A xx = new B();
System.out.println(xx.i);
虽然声明了父类的引用,但我实例化的是子类的对象啊
追答这么说吧,你将父类声明为private,编绎也会报错,因为当你声明为A类型的时候,java虚拟机就会认为实例化对象为一个A类型的对象,这情况下只能访问A中的成员变量和方法,这和List list = new ArrayList()是类似的。
追问在声明父类型A的情况下,怎样才能用到子类型的属性i呢
追答这个问题问得好,如果你想得到子类的属性值或者改变子类的属性值,那就要重写父类的方法,我给个例子吧。
public class Test extends A
int i = -6;
public static void main(String[] args)
A xx = new Test();
System.out.println(xx.getI());
public int getI()
System.out.println("333333");
return i;
public void setI(int i)
System.out.println("444444");
this.i = i;
class A
int i = 12;
public int getI()
System.out.println("1111111");
return i;
public void setI(int i)
System.out.println("2222222");
this.i = i;
这样你就可以访问到子类的i值了,因为子类重写了父类的getI()方法,java的动态绑定机制会在编译的时候认为xx是一个A类型的对象,但是在运行的时候就会动态绑定到Test类型(方法重写了,多态性的体现),绑定到Test类型了,你访问的自然就是Test中的方法了;但是,如果你不重写父类方法,运行的时候还是会调用父类的方法
1、除了JAVA中,子类继承父类的所有方法和属性(构造方法要用关键字super([参数])调用)
另外,当父类的方法或属性被声明为private(私有的)时,子类也是不可以继承的。
2、继承是JAVA中一个重要的特色,便于程序的编写,提高代码的重用性。 参考技术B 子类继承父类的所有(包括私有属性),但是却不能调用父类的私有属性,父类私有的属性方法等子类都不能调用,所以子类里用的getName()在父类里是public的。这是java的一个特性,叫封装
这样可以么?追问
你说错了吧,1.子类继承父类所有属性,除了私有属性 2.我没有进行封装
参考技术C 向上转型时 调用的是父类的属性1.如果给子类i提供get和set 通过get调用的自然是子类的
2.如果给父类和子类分别提供get和set,调的仍然是子类的,因为方法被重写 参考技术D 哥你这个是声明的抽象对象吧 你创建 A new B 干嘛 直接 B xx = new B();
Java中子类能继承父类的私有属性吗?
前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的。当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法。老师给我的解释是这样的——先看下面一段代码
/** * 定义父类 * @author CBS */ public class Father { private String name;//私有属性 private char sex; public void tell(){ System.out.println(name+sex); } private void speak(){ System.out.println(name+"is speaking!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } }
/** * 定义子类,子类中什么都不写。 * @author CBS */ public class Child extends Father { }
/** * 定义测试类 * @author CBS */ public class Test { public static void main(String[] args) { Child c=new Child(); c.tell();//tell方法是可以用的 //c.speak();//报错,父类的私有方法不可见 } }
我们可以看到测试类中即使没有给Child类对象的属性进行赋值,tell方法依旧是可用的。如果Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的所有东西,而修饰符只是影响属性或者方法对外是否可见。
但是个人比较同意Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
Java中修饰符的作用是封装类中的属性和方法使其对外不可见,官方文档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提高代码的重用性,封装则保护了代码的不可见部分。在编写代码的过程中,我们显然即想提高代码的重用性,也不希望类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就生活中的例子来说,Java官方文档的解释也很契合。比如,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。
当然以上的这些理由并不充分,只是笔者的个人见解。关于继承的问题,知乎对此也有讨论,下面这个帖子总结的比较全面,证据也很充足,大家可以去看看:
链接:https://www.zhihu.com/question/51345942/answer/145388196 作者:Robin
以上是关于java子类能继承父类属性吗?的主要内容,如果未能解决你的问题,请参考以下文章