黑马程序员技术交流社区

标题: 想了解一下java中传递参数的问题 [打印本页]

作者: dangfei    时间: 2012-2-24 18:11
标题: 想了解一下java中传递参数的问题
JAVA中定义父类private变量
   通过Spring注入  注入没有问题,不过有一问不明白, 就是说子类继承父类.。
   在子类中调用父类中定义的private 变量, 父类中不提供get方法!
  直接用super.变量名访问程序就报错,   当父类中提供get方法,子类中通过super.get变量名()程序就没问题!  请问这是什么原因,

ps:注入和调数据都没有问题!  就是子类中调用父类的private变量时报错! 父类中提供get方法!通过get方法访问就没问题! 但不提供get方法,直接调用变量就报错!



private  class A
{
     int a;
     String name;
     String sex;
     A(int a,String name,String sex)
     {
         this.a=a;
         this.name=name;
         this.sex=sex;
     }
     void ShowMess()
     {
     }
}
class B extends A
{
     int age;
     B(int a,String name,String sex,int age)
     {
         this.a=a;
         this.name=name;
         this.sex=sex;
         this.age=age;
     }
     void ShowMess()
     {
          System.out.println("a+name+sex+age");
     }
}


作者: tanlei200620    时间: 2012-2-24 22:56
按照你的思路分析(如有不对,多包涵):
private    class A
{
    int a;
    String name;
    String sex;
}//   这样不是把类A的变量都定义成了 private 。
class A
{
    private   int a;
    private   String name;
    private   String sex;
}//  这样才是把类A的变量都定义成了 private 。但是
其次你自己定义了构造函数,通常还需要定义一个空参数的构造函数,除非你有意为之,但是从类B的定义中发现你没有~

如果你确实想定义成 private    class A   ,那么这个是定义在一个类中的成员内部类,

private修饰的成员只能它所属的类中被访问,所以通常都需要get  和set  方法,至于为什么不能访问,是基于安全和稳定的考虑,也可理解为一个多态表现和保护机制,如果子类可以对父类私有变量直接访问,那么再扩展或改写父类就成为了灾难。因为在子类中将很有可能访问不到父类中所定义原先变量名的变量, 还有一个疑问,就是贴主既然定义的私有变量在父类中都没有修改方法,那么应该只有其它相关的方法使用(并且那个值通常不变),那么在子类中完全可以通过对构造函数的控制来满足需求,这又与你擅自修改和调用像违背。  三思而为之。或许这通常跟说的某个软件系统留的接口太少而难以二次开放的境况一样。
作者: 王睿    时间: 2012-2-25 02:22
子类继承父类只是继承了父类的共有方法和共有属性,父类中私有的成员,是继承不了的,只能通过get方法获取。
作者: dangfei    时间: 2012-2-25 17:22
tanlei200620 发表于 2012-2-24 22:56
按照你的思路分析(如有不对,多包涵):
private    class A
{

你好,
private    class A
{
    int a;
    String name;
    String sex;
}//   这样不是把类A的变量都定义成了 private 。
class A
{
    private   int a;
    private   String name;
    private   String sex;

如你所言,你用隐患以及计算机信息安全的角度来说明了
不能扩展或者改写父类,感觉很有新意收下了;
但是仍有疑问,因为父类的方法都能被正常调用,那么为什么一个变量却不能呢?
而且我记得有 重写 这个概念....
作者: 黄方    时间: 2012-2-25 21:02
dangfei 发表于 2012-2-25 17:22
你好,
private    class A
{

至于重写(override)是针对方法而言的,与你说的private 变量没关系,再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。 我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
作者: 黄方    时间: 2012-2-25 22:13
本帖最后由 舞动的心弦 于 2012-2-25 22:14 编辑

准确的来说,你这个问题应该不能归结于传参,其实java中是叫传值和传引用,Java中的参数传递只有一种方式: by value.那么为什么 “当父类中提供get方法,子类中通过super.get变量名()程序就没能跑咧, 就是子类中调用父类的private变量时报错! 父类中提供get方法!通过get方法访问就没问题”,我们知道在java的继承中子类是不能直接访问父类私有成员变量的,那么是不是就只说不能访问了咧,答案是能,那么怎么能咧,这里就要用到我们通常说的继承公共方法访问父类的私有变量,就是在父类里提供一个访问方法!
                因为如果不这样的话,私有变量除了本类的内部类可以直接访问之外,任何其他类都是看不到他的私有变量的。因为私有变量对别的类不可视。
            建议LZ好好看看private,public,package,default属性问题。不足之处请各位补充!!!{:soso_e121:}
作者: a504079589    时间: 2012-2-25 22:26
这样不行!因为私有只能在本类中使用!就算是被子类继承!子类是有父类所有的属性和方法!但是私有的权限修饰符只能在本类中使用!其他类是不能使用的!通过get()方法就可以得到父类中私有的变量值了!




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