2008-04-28

构造方法私有化的作用及接口和父类的辨析

关键字: 深入java语法
在上篇《难倒高手的五行代码》里边,有人说没有意义,在大多数真正编程中确实是没有意义。但是在面试或者考试中是难免遇上。毕竟面试不可能直接让你写个操作系统什么的。这是一般的看法。另一个角度上来说,我觉的有人在编程,也有人需要分析理论。两者都是不能少的。比如你的老师也许到公司编程不如你,但是要交学生你很难比上你的老师。况且你说没用也许因为你看不懂,如果能真正分析清楚这个,你会对Java语言的设计有一个新的了解。
昨天跟同学讨论了下。同学拿c++运行试了,结果产生了不同的结果。
int c=1;c=c++ 这句在Java中运行后c的值是1.但是在C++中是2。
int[] array=new int[5]; int k=2; array[++k]=k=6; 在Java中运行结果k为6,array[3]=6.而在c++中则产生溢出错误。
看来Java和c++在细微之处设计是有很大不同的。
我又试了c#。c#中与Java运行结果相同。c#不得不承认其更接近Java,而不是C++。下面讨论两个问题,是曾经让我迷茫的东西。
(1)java中构造方法如果用private修饰,会产生不能在其他类中用此构造方法创建此类的对象的情况
如下例所示: private修饰的构造方法,不能在类Gz中用此构造方法创建A的对象。
class A{
private A(int a){
System.out.println("This is A");
}
public A(){

}
}
public class Gz{
public static void main(String[] args) {
// TODO 自动生成方法存根
A b=new A();//正确
A a=new A(12);//此句会编译出错,因为私有化方法在其他类中不能访问,构造方法也不例外
}

}
(2)关于接口和父类,想说明几个问题。首先接口中定义的变量即便不加修饰,默认也是static final的。如果接口和父类创建了一个共同的变量,用子类自己创建的对象去访问这个变量会由于不知道使用哪个而出错。但是如果用子类实例化的接口或父类对象却能够正确的访问自己创建的变量
interface Fc{
int a=44;
int b=66;
}
class A{
int a=55;
}
public class Gz extends A implements Fc{
public static void main(String[] args) {
Gz ngz=new Gz();//创建子类的对象
System.out.println(ngz.b);
System.out.println(ngz.a);//此句出错,因为父类和接口都有a,不知道使用哪个
System.out.println(Gz.b);//正确,接口中定义的变量默认是static的,所以可以当作类变量来使用
System.out.println(Gz.a);////此句出错,因为父类和接口都有a,不知道使用哪个
Gz.b=45;//此句出错,接口中的变量默认是final,也就是常量,不能进行修改
System.out.println(Gz.b);
//*********************
Fc f1=new Gz();//用子类来实例化接口对象
System.out.println(f1.a);//此句正确,会自动使用接口中的a
//*********************
A a1=new Gz();//用子类来实例化父类对象
System.out.println(a1.a);//此句正确,会自动使用父类中的a
}

}
评论
naofantian 2008-04-30
不管怎么说,在这文章里我还是学到点东西,谢谢zwm512327的分享。也谢谢pf_miles的提醒,呵呵
zwm512327 2008-04-29
谢谢上面那个朋友,其实写这点东西是因为最近公司有个人开始学Java,他老问我这些语法的东西,有些我能解答,有些有难度,我就记下来跟大家讨论下。这跟我一向的风格也不合。只是我觉的当我被他这些语法的问题难住时候会有点心虚,怕他认为我不会。虚荣心作怪吧。哈哈。听你劝了。以后写些实用的东西,比如Lucene方面的。
去年毕业的,所以还保留学生的风格,你说的对。谢谢你提醒。
pf_miles 2008-04-29
看得出你已经走入了一个语言学习的误区,没搞清楚应该关注什么,不应该关注什么。有些东西不是别人说没用就是没用,也不是你说有用就是有用,而是它“真的没用”;你之前提到过的“高手代码”将成为项目的噩梦,造成维护阶段不可估量的代价付出,希望你能明白;我们要把代码写得像文档一样好理解,并最大程度上代替文档。你所提到的那种特定语言的特定“规律”的规则只是“规则”而已,是一小群人规定的东西,那是特定语言的处理细节,同样的一个运算符,不同的语言可能会有不同的现象发生,就算都是java,有些细节问题在不同的jvm上都会有所差别,然而,一个一个地去了解这些对你的应用程序绝对是“透明”的细节(如果你的应用程序由于这样的细节不同而有了行为上的改变,说明你的程序写错了),会不会太累了呢?而一段时间后,新的环境,新的语言版本出来,你所了解的这些细节“知识”是否还有效,这也是一个问题。其实,这正是语言的设计者不希望我们去了解而想要尽量隐藏的东西,然而总有那么一些人把别人打算隐藏起来的东西活生生地挖出来公之于众,并且以为这是了解了语言的设计,其实不是的,那只是实现细节而已。
真正所谓语言的设计,那么你应该先参考它的jvm的specification,还有编译目标文件的结构设计等等,gc的原理,还有很多可做的tunning,可以慢慢去发掘。
想必你也是个学生,我也是,耐心地解释到如此,希望你能明白。
发表评论

您还没有登录,请登录后发表评论

zwm512327
搜索本博客
最新评论