父类中有个属性不想让子类的实例访问
用private重写好象不行

解决方案 »

  1.   

    属性定义成private的;
    如果父类不可修改,那么在父类和子类直接再增加一层M,在M中重新定义这个变量。不过你要干什么呢?
      

  2.   

    比如我类c1里有个public getAA
    c2继承c1
    但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
    如何隐藏呢
      

  3.   

    说过了不能隐藏如果实在不想要
    可以在子类中用空函数重写(override)子类中
    public int getAA(){}
      

  4.   

    对于继承来说,如果父类的函数或者成员是public的,那么你想隐藏也是隐不了的
    唯一的办法就是你重写它,以于函数你可以用一个空的方法体去实现它。
    对于成员变量,你可以重新定义一个一样的名字的,并赋一个不影响大局的值给 它
      

  5.   

    虽然是空函数
    可是还是可以调用呀
    反而会引起错误了
    我要的效果是如果有调用的话就直接在编译时就要报错
    要不然还有什么意义呢这个好象是java的不合理地方,c#应该是可以的
    好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制
      

  6.   

    "我要的效果是如果有调用的话就直接在编译时就要报错
    要不然还有什么意义呢"
    -_-#楼主bt"好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制"
    这个bt
      

  7.   

    既然是public的,大家都可以访问,否则就声明成private的
      

  8.   

    可以使用 @deprecated来提示
    在编译的时候可以制定编译级别,遇到这种警告就停止编译.
    你能做的也就只是提示一下而已.他们非要使用,你也没办法
      

  9.   

    我真惊了,借大哥这块宝地,让我说说该说的话,我的blog不知道为什么激活不了。
    CSDN不知道你们做什么去了,网站都维护不好,不真不知道该说什么了。
    都去搞程序去了?像我这样的菜鸟,你们是看不起的。。我承认自己没水平,现在水平肯定比你们差,所有就想来向你们学习,可是,我的blog都不能用,你让我怎么想,郁闷了一晚上。
    我感到悲哀,弄个网站还要两次激活,有这个必要吗?
    这是谁的需求?过分的讲究安全就是脱了裤子放屁,自找麻烦 。
    或者是疤瘌眼照镜子,自找难看。
      我听说csdn是全国最专业的,有着最前沿的技术,可这次,我是真的受伤了太伤心,太心酸了
    你们骂我,肯定不会回嘴的,我本来就是个菜鸟,super菜,无敌菜,菜比 
    恩,我是
    希望中国的程序越做越好,csdn成为中国的中流砥柱。。
      

  10.   

    好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制??
    public interface  houzi {
        public void walk();
    }
    public class 古猿 implements houzi {
        public void walk() {
            四个脚 走路
        }
    }
    public class 人 implements houzi {
        public void walk() {
            两个脚 走路
        }
    }很多时候是会碰到楼主的问题,想屏蔽父类的public方法,使的其他使用者不能直接调用,这个时候我们应该考虑我们设计的问题,是不是我们设计的不够合理呢??纯粹个人意见[我也想让java支持你说的,可接口放着不用也挺可惜啊]
      

  11.   

    比如我类c1里有个public getAA
    c2继承c1
    但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
    如何隐藏呢没可能
    虽然是空函数
    可是还是可以调用呀
    反而会引起错误了
    我要的效果是如果有调用的话就直接在编译时就要报错
    要不然还有什么意义呢这个好象是java的不合理地方,c#应该是可以的
    好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制语义不一样 java不是c# 没什么可比性
      

  12.   

    继承关系体现的就是is-a关系
    如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。
      

  13.   

    继承关系体现的就是is-a关系
    如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。----------------------------
    继承关系应该也不是所有的继承
    除了用走路方式来描述四脚或二脚
    假如有一天我们没办法走路了,变得能飞了不能走就去改写人类祖先的定义吗
    因为c#也是对象化的语言,它可以,java不可以
    那就不能说是因为开发者设计上的问题了
    其实直接说java没办法做到就可以了嘛
      

  14.   

    如果有N多种数据库都支持事务处理
    所以你写了个父类、里面有支持事务的方法
    然后再根据不同数据库写不同的子类实现其他功能
    而刚好mysql不支持事务
    这时最好应该是在mysql的子类里取消事务处理
    这样如果是调用mysql时能够避免使用事务
      

  15.   

    有一句话:已经公开了的就不能再是秘密。
       如果有N多种数据库都支持事务处理
       所以你写了个父类、里面有支持事务的方法
       然后再根据不同数据库写不同的子类实现其他功能
       而刚好mysql不支持事务
       这时最好应该是在mysql的子类里取消事务处理
       这样如果是调用mysql时能够避免使用事务
    这是你要考虑你的类的层次关系,或者在MySql的子类里覆盖父类的行为。
      

  16.   

    如果有N多种数据库都支持事务处理
    所以你写了个父类、里面有支持事务的方法
    然后再根据不同数据库写不同的子类实现其他功能
    而刚好mysql不支持事务
    这时最好应该是在mysql的子类里取消事务处理
    这样如果是调用mysql时能够避免使用事务====================================================
    这种设计就是有问题的,这是接口的发挥空间你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?
      

  17.   

    当然是不能隐藏,隐藏本身就不合理(就不符合继承原理)
    重写时抛出
    throw UnsupportedOperationException() 就可以了
      

  18.   

    重写时抛出
    throw UnsupportedOperationException() 就可以了同意这个方法
      

  19.   

    感觉楼主想继承但不想成为 is-a 的关系建议楼主加深对OOP的认识。
      

  20.   

    暂时没有看到一种语言隐藏父类方法的,因为这样不合理。
    --------------
    c#只要重写该方法,然后定义为private就可以了
    这种设计就是有问题的,这是接口的发挥空间你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?
    ---------------------------------
    我当然没有比设计java的人还要牛,不过你这话根本就有问题,
    如果java那么完美的话也就不会有1.0、2.0...这样更新了
    我承认java是个好东西,也许我所提出来的问题不是java的缺点,
    不过并不代表java是完美的哦,也并不代表设计java的人所有的方面都牛哦
    你可别自卑,也许你某些方面就比他牛
      

  21.   

    感觉楼主想继承但不想成为 is-a 的关系建议楼主加深对OOP的认识。
    --------------------------------
    我觉得理论是为实践服务的
    而不是实践去迁就理论
    读死书不见得是好事哦
    所以哪怕是认识再深
    如果不能用来解决事情
    要来何用
      

  22.   

    同意旗鲁特的!应该是:
    throw UnsupportedOperationException() Java的类库中就使用了这种方式!
      

  23.   

    再补充一下,人和古猿其实根本就不是父子类的关系,而是兄弟类的关系,甚至可以说是堂兄弟的关系。一种极端的观点认为:任何class应该不是abstract的,就是final的,因为一个类既然能生成对象,它就不再具有抽象特性,因此也不应当再被继承。
      

  24.   

    interface Interface1{
        public void getB();
        public void getAA();
    }
    interface Interface2{
        public void getA();
    }
    class FatherClass implements Interface2{
        public void getA(){
            System.out.println("This method was implements in FatherClass!");
        }
        public void getAA(){
            System.out.println("This method is in FatherClass!");
        }
    }
    class ChildClass extends FatherClass implements Interface1{
        private ChildClass(){}
        public static Interface1 getInstance(){
            return new ChildClass();
        }
        public void getB(){
            System.out.println("This method is in ChildClass!");
        }
    }
    public class InheritanceClass{
        public static void main(String[] args){
           FatherClass f = new FatherClass();
           Interface1 c = ChildClass.getInstance();
           f.getA();
           //c.getA();//error!
           c.getAA();
           c.getB();
        }
    }
    有点笨,不过好歹有点楼主说的那个意思了.
    一句话:关系好乱啊!
      

  25.   

    用final 声明方法是不可以被子类继承用private 隐藏父类中的变量
      

  26.   

    如果只是隐藏很简单将c1装饰在c2中。interface A{
        c1,c2的公有的抽象方法
        //假设getA方法
        public void getA();
    }public class c1 implements A{
        public void getAA(){}
        public void getA(){}
    }public class c2 implements A{
        private c1 c1=null;
        public void getA(){
            //除了实现功能,你也可以对c1的getA或者你需要的getAA进行调用
        }
    }这样既对c1进行了封装,也对c1功能的扩展,以及c1,c2统一抽象了接口
    在Eclipse源码中IAdaptable接口中的既要对系统的无限扩展,又不希望暴露其成员,当然以这个要复杂的多,可能是你需要的。