好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制?? public interface houzi { public void walk(); } public class 古猿 implements houzi { public void walk() { 四个脚 走路 } } public class 人 implements houzi { public void walk() { 两个脚 走路 } }很多时候是会碰到楼主的问题,想屏蔽父类的public方法,使的其他使用者不能直接调用,这个时候我们应该考虑我们设计的问题,是不是我们设计的不够合理呢??纯粹个人意见[我也想让java支持你说的,可接口放着不用也挺可惜啊]
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(); } } 有点笨,不过好歹有点楼主说的那个意思了. 一句话:关系好乱啊!
用final 声明方法是不可以被子类继承用private 隐藏父类中的变量
如果只是隐藏很简单将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接口中的既要对系统的无限扩展,又不希望暴露其成员,当然以这个要复杂的多,可能是你需要的。
如果父类不可修改,那么在父类和子类直接再增加一层M,在M中重新定义这个变量。不过你要干什么呢?
c2继承c1
但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
如何隐藏呢
可以在子类中用空函数重写(override)子类中
public int getAA(){}
唯一的办法就是你重写它,以于函数你可以用一个空的方法体去实现它。
对于成员变量,你可以重新定义一个一样的名字的,并赋一个不影响大局的值给 它
可是还是可以调用呀
反而会引起错误了
我要的效果是如果有调用的话就直接在编译时就要报错
要不然还有什么意义呢这个好象是java的不合理地方,c#应该是可以的
好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制
要不然还有什么意义呢"
-_-#楼主bt"好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制"
这个bt
在编译的时候可以制定编译级别,遇到这种警告就停止编译.
你能做的也就只是提示一下而已.他们非要使用,你也没办法
CSDN不知道你们做什么去了,网站都维护不好,不真不知道该说什么了。
都去搞程序去了?像我这样的菜鸟,你们是看不起的。。我承认自己没水平,现在水平肯定比你们差,所有就想来向你们学习,可是,我的blog都不能用,你让我怎么想,郁闷了一晚上。
我感到悲哀,弄个网站还要两次激活,有这个必要吗?
这是谁的需求?过分的讲究安全就是脱了裤子放屁,自找麻烦 。
或者是疤瘌眼照镜子,自找难看。
我听说csdn是全国最专业的,有着最前沿的技术,可这次,我是真的受伤了太伤心,太心酸了
你们骂我,肯定不会回嘴的,我本来就是个菜鸟,super菜,无敌菜,菜比
恩,我是
希望中国的程序越做越好,csdn成为中国的中流砥柱。。
public interface houzi {
public void walk();
}
public class 古猿 implements houzi {
public void walk() {
四个脚 走路
}
}
public class 人 implements houzi {
public void walk() {
两个脚 走路
}
}很多时候是会碰到楼主的问题,想屏蔽父类的public方法,使的其他使用者不能直接调用,这个时候我们应该考虑我们设计的问题,是不是我们设计的不够合理呢??纯粹个人意见[我也想让java支持你说的,可接口放着不用也挺可惜啊]
c2继承c1
但不想在c2中体现getAA,也就是不想让人用c2.getAA来访问
如何隐藏呢没可能
虽然是空函数
可是还是可以调用呀
反而会引起错误了
我要的效果是如果有调用的话就直接在编译时就要报错
要不然还有什么意义呢这个好象是java的不合理地方,c#应该是可以的
好比以前古猿可以用四个脚,现在人进化了,要求不要用四个脚,却得不到限制语义不一样 java不是c# 没什么可比性
如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。
如果子类“隐藏”了父类的方法,按楼主的编译都要报错的要求,那就相当于子类没有父类的该方法,子类没有了父类的方法,那么子类就not is a父类了。这就违反了继承关系的初衷,本来就不应该走这条路。----------------------------
继承关系应该也不是所有的继承
除了用走路方式来描述四脚或二脚
假如有一天我们没办法走路了,变得能飞了不能走就去改写人类祖先的定义吗
因为c#也是对象化的语言,它可以,java不可以
那就不能说是因为开发者设计上的问题了
其实直接说java没办法做到就可以了嘛
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务
如果有N多种数据库都支持事务处理
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务
这是你要考虑你的类的层次关系,或者在MySql的子类里覆盖父类的行为。
所以你写了个父类、里面有支持事务的方法
然后再根据不同数据库写不同的子类实现其他功能
而刚好mysql不支持事务
这时最好应该是在mysql的子类里取消事务处理
这样如果是调用mysql时能够避免使用事务====================================================
这种设计就是有问题的,这是接口的发挥空间你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?
重写时抛出
throw UnsupportedOperationException() 就可以了
throw UnsupportedOperationException() 就可以了同意这个方法
--------------
c#只要重写该方法,然后定义为private就可以了
这种设计就是有问题的,这是接口的发挥空间你这只古猿(根据你的逻辑得到的结论),你比设计Java的人还要牛?
---------------------------------
我当然没有比设计java的人还要牛,不过你这话根本就有问题,
如果java那么完美的话也就不会有1.0、2.0...这样更新了
我承认java是个好东西,也许我所提出来的问题不是java的缺点,
不过并不代表java是完美的哦,也并不代表设计java的人所有的方面都牛哦
你可别自卑,也许你某些方面就比他牛
--------------------------------
我觉得理论是为实践服务的
而不是实践去迁就理论
读死书不见得是好事哦
所以哪怕是认识再深
如果不能用来解决事情
要来何用
throw UnsupportedOperationException() Java的类库中就使用了这种方式!
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();
}
}
有点笨,不过好歹有点楼主说的那个意思了.
一句话:关系好乱啊!
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接口中的既要对系统的无限扩展,又不希望暴露其成员,当然以这个要复杂的多,可能是你需要的。