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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闪亮未来 高级黑马   /  2013-11-2 20:11  /  1885 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 闪亮未来 于 2013-11-2 20:22 编辑
  1. class Tel
  2. {
  3.         private int num;
  4.         private String name;
  5.         public void setNum(int num)
  6.         {
  7.                 this.num=num;
  8.         }
  9.         public void setName(String name)
  10.         {
  11.                 this.name=name;
  12.         }
  13.         void show()
  14.         {
  15.                 System.out.println(num);
  16.         }
  17. }
  18. class NewTel extends Tel
  19. {
  20.         void show()
  21.         {
  22.                 super.show();
  23.                 System.out.println(name);
  24.         }
  25.         
  26. }
复制代码
里面的class Tel中的 num 与name 都被私有化了,后面主函数的代码我没贴上来,问题就在我执行子类的show()时,提示:ExtendsDemo3.java:23: 错误: name可以在Tel中访问private
                System.out.println(name);


为什么只有name 提示错误,num也私有化了为什么没有错误呢?还有如果想要name可以在Tel中访问private 中的name ,要怎么修改代码呢,前提是不能把private删掉。
看了零基础学起来还是很困难啊,各种问题啊

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

19 个回复

倒序浏览
因为你super.show()调用的是父类方法,本类方法可以访问本类私有成员。而下面的System.out.println(name);其实name是super.name的简写,但是name已经被私有,非本类成员不能访问。
回复 使用道具 举报
因为子类在继承了父类后可以将父类的方法进行重写,子类的show()中super.show()是在调用父类的show()方法,而 System.out.println(name);用到了父类中的私有变量name
回复 使用道具 举报
寻丶丶觅 发表于 2013-11-2 20:27
因为你super.show()调用的是父类方法,本类方法可以访问本类私有成员。而下面的System.out.println(name); ...

如果非要访问其他类的私有成员怎么修改代码
回复 使用道具 举报
joechen 发表于 2013-11-2 20:32
因为子类在继承了父类后可以将父类的方法进行重写,子类的show()中super.show()是在调用父类的show()方法, ...

后面那个问题还没解答哦
回复 使用道具 举报
一般允许被访问的成员变量都会给getter方法,不允许的自然不能被访问
回复 使用道具 举报
class Demo
{
public void setNum(int num)
        {
                this.num=num;
        }public int getNum()
{
return this.num;
}
public void setName(String name)
        {
                this.name=name;
        }
public String getName()
{
return this.name;
}

}

在其他类中建立Demo的对象即new Demo()   用对象调用getAge()和getName()
回复 使用道具 举报
第一:num也私有化了为什么没有错误呢? -----因为你没有调用num,所以没有提示   
第二:要想引用private name,那么必须在父类中定义一个getName()函数,这样才能得到name值,否则不可以。
public String getName()
{return name;}
回复 使用道具 举报
因为访问到NAME的时候已经出错了,程序流程终止了,所以只报了一个错
还有,继承是不会继承私有成员的,子类无法访问父类的私有变量!
回复 使用道具 举报
1、你的变量都是私有的,子类肯定访问不到。看下图就能明白,

2、对象封装特点就是将变量设成私有,然后通通过公有方法调取,所以使用set get方法即可。具体操作如下图
在你Tel类代码区域点击右键,然后操作如下图红框。


然后选择get方法,如果需要set方法也一同选中,点击提交。OK后,系统会自动在你TEL类中生成公有方法。



这样你在子类或其他地方都可以通过get方法来获取这个变量,如下:
System.out.println(new Tel().getName());

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 魏-玉-彪 于 2013-11-2 22:30 编辑
  1. class Tel
  2. {
  3.         private int num;
  4.       //  String name; 第一方案,此处不用private 修饰符
  5.        private String name;

  6.         public void setNum(int num)
  7.         {
  8.                 this.num=num;
  9.         }
  10.         public void setName(String name)
  11.         {
  12.                 this.name=name;
  13.         }
  14.         void show()
  15.         {
  16.                 System.out.println(num);
  17.         }

  18.                           public int getNum(){          // 第二方案 第一步此处加上本方法,意思是父类自己的方
  19.                                                                    //法操作自己的变量,而此方法可以被子类继承
  20.                                           return num;
  21.                                }


  22. }
  23. class NewTel extends Tel
  24. {
  25.         void show()
  26.         {
  27.                 super.show();
  28.                 System.out.println(name);  //   问题在这里,因为是父类私有,所以,本类无法继承父类的name;
  29.                                                             // 所以也无法访问,第一解决保留此处
  30.                System.out.println(getNum());// 采用第二方案 ,此处打印参数改为 getNum()方法



  31.         }
  32.         
  33. }
复制代码
回复 使用道具 举报
那得好好想想 发表于 2013-11-2 21:28
1、你的变量都是私有的,子类肯定访问不到。看下图就能明白,

2、对象封装特点就是将变量设成私有,然后通 ...

你看的是什么视频?
怎么我的视频中没有你的这些东西呢?
回复 使用道具 举报

知道问题在这里,我问的就是这个问题怎么解决
回复 使用道具 举报
那得好好想想 发表于 2013-11-2 21:28
1、你的变量都是私有的,子类肯定访问不到。看下图就能明白,

2、对象封装特点就是将变量设成私有,然后通 ...

嗯,差不多知道该怎么改了,你这个工具好高级
回复 使用道具 举报
本帖最后由 李新辉 于 2013-11-2 22:21 编辑

复制代码
  1. class Tel
  2. {
  3.         private int num;
  4.         private String name;
  5.         public void setNum(int num)
  6.         {
  7.                 this.num=num;
  8.         }
  9.         public void setName(String name)
  10.         {
  11.                 this.name=name;
  12.         }
  13.         void show()
  14.         {
  15.                 System.out.println(num);
  16.         }
  17. }
  18. class NewTel extends Tel
  19. {
  20.         void show()
  21.         {
  22.                 super.show();    //这句话的意思是调用父类方法,但是这个父类方法没有被私有修饰。父类方法当然能够调用父类的私有成员
  23.                 System.out.println(name);//这里调用了父类的私有成员当然报错……
  24.         }
  25.         
  26. }
复制代码
为什么只有name 提示错误,num也私有化了为什么没有错误呢?


因为只是调用的是父类非私有方法,这个方法怎么操作父类数据跟子类没关系super语句只是子类让父类帮它做了一些事情

我要你帮我买本书,我有必要抬着你的手付款给卖家吗?手臂是你的,我虽然无权操作你的手,但是你自己会抬手的……
--------------------------------------------------------------------------------------------
还有如果想要name可以在Tel中访问private 中的name ,要怎么修改代码呢,前提是不能把private删掉。

(1)要么非私有,即删去private。但是一般不这么做,一般提供共有访问方法
(2)要么在父类中提供共有的访问方法,子类继承了这个方法就可以访问
====================================================
被privite修饰,就被封装了
子类根本不知道父类中的私有成员的,就无从调用了

可以参考我的帖子:
关于子父类中函数的重载与重写问题
http://bbs.itheima.com/thread-93684-1-1.html





回复 使用道具 举报
李新辉 发表于 2013-11-2 21:45
你看的是什么视频?
怎么我的视频中没有你的这些东西呢?

工具自动生成的,小技巧而已啊。视频应该都会说,用到自然就会了。
回复 使用道具 举报
那得好好想想 发表于 2013-11-2 21:28
1、你的变量都是私有的,子类肯定访问不到。看下图就能明白,

2、对象封装特点就是将变量设成私有,然后通 ...

我是说你的第一张图
好像不是毕老师的视频里面的……
回复 使用道具 举报
今天正好看到这,正好做个总结吧
1.super关键字的用法
1)子类中调用父类中的构造方法
2)调用父类中的普通方法
3)调用父类中的非私有属性

2.子类不可以直接访问父类的私有成员,但可以通过setter或geter访问

3.你需要在父类中添加getName()方法
  public String getName(){
       return name;
  }

子类中的show()改为
void show()
        {
                super.show();
                System.out.println(getName());
        }

回复 使用道具 举报
父类私有字段,子类无法访问,suepr.show().调用父类方法访问父类字段没有问题。想可以访问可以改成public 或者protected 。写的多了你就知道了,如果希望子类继承的字段和方法都要是Public的。你想不改private,可以super.name来调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马