黑马程序员技术交流社区

标题: JAVA继承的的疑惑 [打印本页]

作者: 何仕映    时间: 2013-3-16 10:02
标题: JAVA继承的的疑惑
本帖最后由 何仕映 于 2013-3-16 14:18 编辑

1、在JAVA中父类的私有方法,子类是不能够继承的,因为子类“看不到”父类的私有方法。为什么父类的私有属性子类就能够继承呢?
2、如果在父类中定义了一个方法,操作了父类的私有属性,在子类继承父类之后,想重新定义这个方法,操作的仍有从父类继承过来的私有属性,能够不改变源码,将功能复写吗?(如下面的这个代码,在学生继承Person之后,我不需要打印出年龄,只需打印姓名和学号,该如何复写呢?)
  1. class Person //定义Person类
  2. {
  3.        private String name; //定义Person类的两个属性name和age;
  4.        private int age;

  5.       Person(String name,int age)//构造函数初始化
  6.       {
  7.               this.name = name;
  8.               this.age = age;
  9.       }

  10.    void show() //show方法,说出自己的属性
  11.       {
  12.               System.out.println("My name is:"+name+"\t"+"I am "+age+" years old");
  13.       }
  14. }

  15. class Student extends Person //Student继承了Person。
  16. {
  17.          private int studentid; //增加了一个特有属性学号
  18.          Student(String name,int age) //当未分配学号的时候,构造函数初始化
  19.           {
  20.                  super(name,age); //调用父类的构造函数初始化
  21.           }

  22.       Student(String name,int age,int studentid)//当有name、age、studentid三个属性的构造函数
  23.        {
  24.                 this(name,age);
  25.                 this.studentid = studentid;
  26.        }

  27.      void show() //重写show()方法
  28.         {
  29.                System.out.println("My name is:"+name+"\t"+"My id is "+id);//jvm报错,因为操作了父类里面的私有属性。
  30.         }
  31. }

  32. class ExtendsDemo3 //主函数
  33. {
  34.         public static void main(String[] args)
  35.           {
  36.                    Student a = new Student("张三",23);
  37.                    a.show();
  38.           }
  39. }
复制代码

作者: 黑马-李嘉欣    时间: 2013-3-16 10:25
1.private属性确实能够被继承,但是因为访问权限是private,只有在该类内才能访问。这是由JDK规定的,记住就好了~
作者: 刘海陆    时间: 2013-3-16 10:25
不改变源码,我感觉只能在System.out.print在这里改动了
作者: 何仕映    时间: 2013-3-16 10:31
小马过河 发表于 2013-3-16 10:25
不改变源码,我感觉只能在System.out.print在这里改动了

该如何复写呢?麻烦您给我说一下,谢谢。
作者: HM马明宇    时间: 2013-3-16 10:33
本质上来说,父类的所有成员均能继承,只不过由于访问权限的问题,子类无法访问。
源码能改也无用啊,这是一种规定,跟jvm有关。
既然你要用父类里面现成的方法,在父类中定义变量的时候,就应该考虑到子类的可访问性。
继承的特点就是复用,而私有属性跟继承本来就是相悖的。
所以,一般情况下,为了让子类使用而写的方法,很少会使用私有属性!

作者: 张文星    时间: 2013-3-16 10:39
私有属性同样也是不能继承的
你可以给父类的属性添加get方法和set方法,这个是public的
  1. public int getAge() {
  2.                 return age;
  3.         }

  4.         public void setAge(int age) {
  5.                 this.age = age;
  6.         }

  7.         public String getName() {
  8.                 return name;
  9.         }

  10.         public void setName(String name) {
  11.                 this.name = name;
  12.         }
复制代码
这样就可以操作私有属性了,这也是程序封装的一种体现
作者: 王洪宇    时间: 2013-3-16 13:16
class Person //定义Person类
{
       private String name; //定义Person类的两个属性name和age;
       private int age;
       public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }
      Person(String name,int age)//构造函数初始化
      {
              this.name = name;
              this.age = age;
      }

   void show() //show方法,说出自己的属性
      {
              System.out.println("My name is:"+name+"\t"+"I am "+age+" years old");
      }
}

class Student extends Person //Student继承了Person。
{
         private int studentid; //增加了一个特有属性学号
         Student(String name,int age) //当未分配学号的时候,构造函数初始化
          {
                 super(name,age); //调用父类的构造函数初始化
          }

      Student(String name,int age,int studentid)//当有name、age、studentid三个属性的构造函数
       {
                this(name,age);
                this.studentid = studentid;
       }

     void show() //重写show()方法
        {
               System.out.println("My name is:"+getName()+"\t"+"My id is "+id
        }
}

class ExtendsDemo3 //主函数
{
        public static void main(String[] args)
          {
                   Student a = new Student("张三",23,11001100);
                   a.show();
          }
}

父类中的私有属性子类是可以继承到的,但是无法直接修改或者直接获得。
可以在父类中提供私有属性的公共访问办法。
子类可以直接使用父类提供的公共访问办法。
作者: 123    时间: 2013-3-16 14:28
父类私有的任何东西,子类都不能获得或者访问。




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