黑马程序员技术交流社区

标题: 黑马程序员 java继承的小问题(我刚学到这部分!!!) [打印本页]

作者: 北极雪871208    时间: 2014-3-17 16:37
标题: 黑马程序员 java继承的小问题(我刚学到这部分!!!)
---------------------- <a target="blank">ASP.Net+Unity开发</a>、<a target="blank">.Net培训</a>、期待与您交流! ----------------------
public abstract class A {

  int i=1;

  public void printI() {

  System.out.println("i="+i);

  }

  }

  public class B  extneds A{

  int i=2;

  public static void main(String[] args) {

  B b=new B();

  b.printI();

  }

  }
打出来是几?

---------------------- <a target="blank">ASP.Net+Unity开发</a>、<a target="blank">.Net培训</a>、期待与您交流! ----------------------
作者: 王竞    时间: 2014-3-17 17:02
按照你的思路,打印出来
i=1;



public class Demo1 extends A{

        int i=2;

        public static void main(String[] args) {

                Demo1 b=new Demo1();

                b.printI();
        }
}

abstract class A {
        int i=1;
        public void printI() {
                System.out.println("i="+i);
        }

}

你想问什么呢???
作者: 黄陂酷歌    时间: 2014-3-17 21:18
首先,你的代码写错了,不能编译,一个java文件中怎么能够有两个公共类?这是不正确的,
即使你代码没有问题,这个结果也是i=1,英文你的b类中没有定义一个覆盖a类中的printi()方法的方法建立一个b对象依然继承了父类的方法打印1.
作者: 李猛    时间: 2014-3-17 21:50
如果编译通过答案是父类中的成员变量<i>的值,我的一般是这么理解的就像局部屏蔽全局一样,父类中的方法自然应该先考虑自己父类中的的变量,如果子类复写父类方法那就应该是调用子类的成员变量<i>了
作者: 王竞    时间: 2014-3-17 23:59
建议你学习一下以下的内容:
java继承的总结:
1.构造函数:
        当子类继承一个父类时,构造子类时需要调用父类的构造函数,存在三种情况
        (1),父类无构造函数或者一个无参数构造函数,子类若无构造函数或者有无参数构造函数,子类构造函数中不需要显式调用父类的构造函数,系统会自动在调用子类构造函数前调用父类的构造函数
         (2),父类只有有参数构造函数,子类在构造方法中必须要显示调用父类的构造函数,否则编译出错
         (3),父类既有无参数构造函数,也有有参构造函数,子类可以不在构造方法中调用父类的构造函数,这时使用的是父类的无参数构造函数
2.方法覆盖:
          (1)子类覆盖父类的方法,必须有同样的参数返回类型,否则编译不能通过
          (2)子类覆盖父类的方法,在jdk1.5后,参数返回类可以是父类方法返回类的子类
         (3)子类覆盖父类方法,可以修改方法作用域修饰符,但只能把方法的作用域放大,而不能把public修改为private
          (4)子类方法能够访问父类的protected作用域成员,不能够访问默认的作用域成员
         (5)子类的静态方法不能隐藏同名的父类实例方法
         (6)java与C++一样,继承的方法具有多态性
3.成员覆盖:
         (1)当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
          这个听起来很容易理解的一回事,但是实际使用过程中很多人容易搞混:尤其是在多态的时候,调用一个被继承的方法,该方法访问是一个被覆盖的成员m,那么方法中到底是访问了父类的成员还是子类的成员m?结论是,若实际调用的是父类的方法,就使用了父类的该成员m,若实际调用的是子类的方法,就使用子类的成员m,记住一句,每个类使用成员都相当于在前面加了 一个this指针。

可以参考以下代码思考以下:
    class SuperClass {  
        private int number;  
      
      
        public SuperClass() {  
            this.number = 0;  
        }  
      
      
        public SuperClass(int number) {  
            this.number = number;  
        }  
      
      
        public int getNumber() {  
            number++;  
            return number;  
        }  
    }  
      
    class SubClass1 extends SuperClass {  
        public SubClass1(int number) {  
            super(number);  
        }  
      
    }  
      
    class SubClass2 extends SuperClass {  
        private int number;  
      
      
        public SubClass2(int number) {  
            super(number);  
        }  
      
    }  
      
    public class SubClass extends SuperClass {  
      
        private int number;  
      
      
        public SubClass(int number) {  
            super(number);  
        }  
      
      
        public int getNumber() {  
            number++;  
            return number;  
        }  
      
      
        public static void main(String[] args) {  
            SuperClass s = new SubClass(20);  
            SuperClass s1 = new SubClass1(20);  
            SuperClass s2 = new SubClass2(20);  
            System.out.println(s.getNumber());  
            System.out.println(s1.getNumber());  
            System.out.println(s2.getNumber());  
            //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法  
            //结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量  
        }  
      
    }  

最好自己写一下代码,加深印象
作者: 北极雪871208    时间: 2014-3-19 09:20
恩恩!小弟是初学者!谢谢各位的帮忙!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2