A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何仕映 中级黑马   /  2013-3-16 10:02  /  1626 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何仕映 于 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 14:02

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

9 个回复

倒序浏览
1.private属性确实能够被继承,但是因为访问权限是private,只有在该类内才能访问。这是由JDK规定的,记住就好了~
回复 使用道具 举报
不改变源码,我感觉只能在System.out.print在这里改动了
回复 使用道具 举报
小马过河 发表于 2013-3-16 10:25
不改变源码,我感觉只能在System.out.print在这里改动了

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
私有属性同样也是不能继承的
你可以给父类的属性添加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.         }
复制代码
这样就可以操作私有属性了,这也是程序封装的一种体现

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你只是调用了父类的构造方法,如果你想显示Student自己的name的话需要在Student类设一个私有成员变量name
代码已调试好。
  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 String name;//这里Student类必须也得有个私有的name
  18.          private int studentid; //增加了一个特有属性学号
  19.          Student(String name,int age) //当未分配学号的时候,构造函数初始化
  20.           {
  21.                  super(name, age);//调用父类的构造函数初始化
  22.               this.name = name; //这里需要给Student类的name赋值,不然只是调用了父类的构造方法
  23.           }

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

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

  34. class Test //主函数
  35. {
  36.         public static void main(String[] args)
  37.           {
  38.                   // Person a = new Person("张三",23);
  39.                    Student s = new Student("张三", 23, 10001);
  40.                   
  41.                    s.show();
  42.           }
  43. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
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:18
9#
父类私有的任何东西,子类都不能获得或者访问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马