黑马程序员技术交流社区

标题: 关于子类的成员变量的问题 [打印本页]

作者: 邓超军    时间: 2012-7-17 21:28
标题: 关于子类的成员变量的问题
  1. abstract class Person
  2. {
  3.         private String name;
  4.         Person(String aName)
  5.         {
  6.                 name=aName;
  7.         }
  8.         public String getName()
  9.         {
  10.                 return name;
  11.         }
  12. }

  13. class Student extends Person
  14. {
  15.         private String major;
  16.         Student(String aName,String aMajor)
  17.         {
  18.                 super(aName);
  19.                 major=aMajor;
  20.         }
  21.        
  22.         public String getInfo()
  23.         {
  24.                 return name+"..."+major;//Student继承了Person,不是也有name
  25.                                         //这个成员变量吗?为什么还出错?
  26.         }
  27. }
复制代码

作者: 周坤    时间: 2012-7-17 21:41
private String name;//父类里的name是private的,子类不能继承过来,想要直接用起码要改成protected,或者调用方法,当然调用getname方法比较常规。
作者: 赵倩倩    时间: 2012-7-17 21:45
访问限制符  private只有本类可以使用
           默认friendly可以被同包的类访问  
           protect 可被本类 同包 子类
           public 都可以调用
所以应该在public String getInfo()

        {

                return getName()+"..."+major;//Student继承了Person,不是也有name

                                        //这个成员变量吗?为什么还出错?

        }
作者: 杨康    时间: 2012-7-17 22:17
父类中的变量被私有了,子类就不能够直接访问父类中的变量,可以通过父类提供的方法 void getName()方法来调用,在你的代码中,直接拿来用是不可以的。
私有成员后,子类相当于看不到那些被私有的成员,所以不能直接拿来用。
作者: 周玉龙    时间: 2012-7-17 23:14
3:权限修饰符
                同一个类中        同一个包中        不同包中的子类中 不同包中
private        OK                               
(default)        OK                OK
protected        OK                Ok                OK
public                OK                OK                OK                        OK

继承中的成员变量的特点:
1:子类直接继承了本身没有的成员变量。
2:当子类中有和父类同名的成员变量时。在方法中打印的是子类自己的。
3:当子类方法中有局部变量和成员变量同名,在方法中打印的是局部变量。
4:私有的成员变量是不能被继承的。

一般用公有的方法来获取其值,既然是其子类,那么就继承了他个公有的方法,比如getName();所有可以直接调用这个方法。但是如果在一个静态的方法中就不能直接调用
而需要通过实例对象的引用来调用,因为静态方法不能直接调用非静态方法,如果子类中复写了父类的这个方法,那么就必须通过super.getName()来调用父类中的此方法。


作者: 侯茂绵    时间: 2012-7-17 23:46
abstract class Person
{
private String name; //  private是私有的意思   在这里使用private就是把name私有化啦
                                   所以子类无法继承name
                                   不要private就OK拉
作者: 王龙彪    时间: 2012-7-17 23:57
私有化的成员变量不能直接访问,需要用getName()这个public的函数来获取{:soso_e100:}
作者: 张世威    时间: 2012-7-17 23:59
本帖最后由 张世威 于 2012-7-18 00:01 编辑

这是一个访问权限的问题:
1、子类可以继承父类的所有成员(除了构造函数),不管父类的成员是什么权限的,不过继承归继承,访问又是另外一回事了。  就像有什么用什么是不一样的,你能用的一定是你有的,不过你有的你不一定能用。举个例子,你爸爸在银行里给你存了100元,这100元可以说是你所拥有的,不过,你却不能直接到银行去取这100元,你要想用这100元,还是需要找你爸爸,看他提没有提供方式让你用,比如说给你银行卡和密码。

       这样的方式就限定死了你能用这100元的方式了,这样就可以有效的控制了这100元钱,不然100元钱被你用光了,你爸爸还不知道。

2、就像这个父类里面,有getName方法,限定死了,你只能获取name的值,不能对name有其他的操作了。如果父类允许你修改的话,还会提供setName方法,这一对方法叫:访问器和设置器,它封装了内部的实现。

3、继承什么和访问什么没有关系,切记。
     四种访问权限:
   ①public:所有类都可以访问,
   ②protected:子类和同包类,
   ③ 缺省:同包类
  ④ private:本类,
一般都把字段设置成private,为字段设置的方法为public,用这种方式有效控制字段的访问。
  
作者: 乞文超    时间: 2012-7-18 00:53
父类中的私有成员只能在本类中,子类不可以访问,如果访问,可以通过方法访问
1) private
  类中限定为private的成员,只能被这个类本身访问。
  如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。

  2) default
  类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

  3) protected
  类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。

  4) public
  类中限定为public的成员,可以被所有的类访问。
作者: 张世威    时间: 2012-7-18 01:16
本帖最后由 张世威 于 2012-7-18 01:17 编辑
周坤 发表于 2012-7-17 21:41
private String name;//父类里的name是private的,子类不能继承过来,想要直接用起码要改成protected,或者 ...

1、哥们,子类可以继承父类除了构造函数外的所有成员,只是父类对不同的成员设置了不同的权限。
2、继承=拥有 ,访问=使用,     你拥有什么,你就一定能用什么啊?你能用的肯定属于你拥有的
3、在java里面,为了防止成员被滥用,所有设置了权限。你学习了反射后就知道了,反射就是暴力访问哪些不让访问的,既然能暴力访问的到,那么这些私有的成员自然都被继承来了。
作者: 周坤    时间: 2012-7-18 01:28
张世威 发表于 2012-7-18 01:16
1、哥们,子类可以继承父类除了构造函数外的所有成员,只是父类对不同的成员设置了不同的权限。
2、继承= ...

哦,哦,你是对的,的确可以继承,我有点模糊,还要加油看啊!
作者: 张世威    时间: 2012-7-18 01:34
哈哈,互相学习啊,我也是看了你的说法后,好好查了资料的,学了不少东西
作者: 张世威    时间: 2012-7-18 01:35
周坤 发表于 2012-7-18 01:28
哦,哦,你是对的,的确可以继承,我有点模糊,还要加油看啊!


哈哈,互相学习啊,我也是看了你的说法后,好好查了资料的,学了不少东西




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