java子类继承父类问题

2019-03-25 13:44|来源: 网路

java子类继承父类问题
求解释! 虽然做了几年的开发
但确实不明白为什么?
class Foo {
 public int a;
 public Foo() { a = 3; }
 public void addFive() { a += 5; }
}

public class Bar extends Foo{
    public int a;
    public Bar() { a = 8; }
    public void addFive() { this.a +=5; }
    
    public static void main(String[] args) {
        Foo foo = new Bar();
         foo.addFive();
         System.out.println("Value: "+ foo.a);
    }

}



结果为什么输出的是3
可以试下~
求解释

问题补充:
看到楼下的很多朋友的回答
我之前也是这么认为的
与java得多态有关 方法可以多态重载,但属性不能

假设这样设想 我想得到结果是
在父类的属性a的值的基础上 让其用子类的加法进行呢?

如何实现呢?
public int addFive() {
  super.a += 5;
}

就可以了

相关问答

更多
  • 父类在子类实例化之前就被实例化了,所以说子类继承过来的属性都是实例化之后的值。这话我说着比较废话,父类不实例化的话压根谈不到调用啊什么的。 但是实例化的时候,类属性只是拥有一个默认的值,比如int型的默认值就是0,所以实际用的时候可能用构造方法或者set方法再设置一遍。 父类以什么身份进入子类。这个问题,父类压根儿不进入子类,子类只是可以调用父类的属性和方法,拥有父类的特性,除此之外没什么关系了。
  • 在用类声明一个对象时才会调用构造方法,如果你只需调用ListAdapter这个方法,那么你把它设置成静态方法不就行了嘛,调用时直接用ListActivity.ListAdapte()。
  • 特殊规定。 你可以在子类构造器的其他部分使用 this,但是在调用父类构造器的时候使用 this 试试? 这就说明“子类构造器中第一句调用父类构造器”实际上是一个特殊的语法结构,它跟子类构造器中的其他语句是不同的部分。既然知道了它们是不同的部分,它们执行的时机不一样这种事实应该是能理解的 至于这种规定合不合理,符不符合直觉,这里就不评价了
  • 不是~~但是至少应该调用一个!也可以全部调用的! 任意一个类都拥有构造器的!如果你自己没有写,系统会给你加上一个默认的,没有参数的构造器,如果你自己写了,系统不会给你加上去的! 因为继承就是要把父类的东西拿给自己,并在此基础上扩充自己! 子类在调用构造器的时候,不知道父类拥有什么,所以我们需要调用父类的构造器! 如果父类没有自己写构造器,在子类中你自己不写 super 调用构造器的时候~~系统会调用父类的默认的构造器! 你也可以自己写上想调用父类的哪一个构造器! 要关灯了~~~ 欢迎发消息继续交流!
  • 有构造函数的调用和非构造函数的调用 class A{ public A(){ } public protected void function(){ } private void function11(){ //不可被子类调用private修饰的,最低级别至少是protected } } class B extends A{ public void function2(){ function();//也可以用super.function(); } public B(){ super(); } }
  • a的方法用的是子类继承或重写的方法。 属性是父类的属性。 这是多态的范畴。也常用于接口回调等。 注意不要调用子类的新方法。 当父类是抽象类时,就可用这种构造方式得到能使用指定方法的对象。 如:Map mp = new HashMap();
  • 没有修饰符,默认就是protected的,这种变量是能被子类访问的。
  • 如果这不是家庭作业(第三方图书馆可能不被允许),我会建议Google Reflections的Reflections#getSubTypesOf() 。 Set> subTypes = reflections.getSubTypesOf(A.class); 您可以通过自己扫描类路径来自己做更少或更多的事情,从以名称传递"" ClassLoader#getResources()开始。 If this wasn't homework (where 3rd party li ...
  • 你永远不会调用父类的__init__函数,这是定义这些属性的地方: class Manager(Employee): def __init__(self, reports): super(Manager, self).__init__() self.reports = reports 为此,您必须修改Employee类的__init__函数并为参数提供默认值: class Employee(object): def __init__(self, emp=None, name=N ...
  • 从文档中 ; 除了没有超类的对象之外,每个类都有且仅有一个直接超类(单继承)。 在没有任何其他显式超类的情况下,每个类都隐式地是Object的一个子类。 类可以派生自派生自类的类的类,等等,最终派生自最上面的类Object。 据说这样的一个类是从继承链中的所有类继承到对象的后代。 因此, Fillet是Food和Chicken类的后裔。 它将根据最上层类中使用的访问修饰符从其父类的超类中显式继承。 From the documentation; Excepting Object, which has no ...