`
zwm512327
  • 浏览: 56676 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

阅读更多
    在上篇《难倒高手的五行代码》里边,有人说没有意义,在大多数真正编程中确实是没有意义。但是在面试或者考试中是难免遇上。毕竟面试不可能直接让你写个操作系统什么的。这是一般的看法。另一个角度上来说,我觉的有人在编程,也有人需要分析理论。两者都是不能少的。比如你的老师也许到公司编程不如你,但是要交学生你很难比上你的老师。况且你说没用也许因为你看不懂,如果能真正分析清楚这个,你会对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
}

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

相关推荐

    Java语言中的构造方法私有化.pdf

    在Java中,除了单态模式,构造方法私有化还常用于其他设计模式,如工厂模式(Factory Pattern)和抽象工厂模式(Abstract Factory Pattern),以及作为静态工具类(Static Utility Class)的实现方式,防止这些类被...

    构造方法私有化

    NULL 博文链接:https://chaoyi.iteye.com/blog/2078079

    子类引用父类构造方法

    java训练题目 编写程序实现子类对父类构造方法的引用?

    java中的继承(子类调用父类构造方法还不懂).doc

    ### Java中的继承(子类调用父类构造方法) #### 一、继承的基本概念 Java是一种支持面向对象编程的语言,其中“继承”是一项核心特性。继承允许创建一个新的类(称为子类或派生类),该类继承了现有类(称为父类...

    构造方法JAVA构造方法

    构造方法与抽象类和接口 - 抽象类可以有构造方法,但接口不能。接口中的所有成员都是公开的(public),因此在接口中定义构造方法是非法的。 - 抽象类的子类在实例化时,必须调用抽象类的构造方法来初始化父类的...

    java构造方法私有化

    构造方法私有化,也是说,这个类的构造方法是私有的。比如:  public class Person{  private String name;  Private Person(String Name){ //私有的构造方法  this.name = name;  }  }  我们不能...

    c++ 子类构造函数初始化及父类构造初始化的使用

    "C++ 子类构造函数初始化及父类构造初始化的使用" C++ 中的构造函数初始化是指在类对象创建时对其进行初始化的过程。构造函数是类的特殊成员函数,用于初始化类对象。在 C++ 中,子类构造函数的初始化涉及到父类...

    Java的子类调用父类的构造方法.pdf

    Java的子类调用父类的构造方法.pdf

    NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例

    本篇文章将深入探讨如何在NDK环境中调用Java的构造方法、父类方法以及处理Java返回的中文字符串可能出现的乱码问题。 首先,让我们了解一下在C/C++中调用Java的方法。这主要依赖于JNI(Java Native Interface)。...

    java构造方法

    构造方法的主要作用是在创建对象时初始化该对象的状态。通过在构造方法中设置初始值,可以确保对象在使用前已经被正确初始化,从而避免潜在的错误和异常。 #### 三、构造方法的分类 构造方法可以根据参数的不同...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    子类对象构建调用父类的构造方法

    程序中描述了子类对象构建调用父类的构造方法,以及类变量和实例变量创建的不同过程

    java 构造方法的资源

    在Java编程语言中,构造方法(Constructor)是一个特殊的方法,它的主要作用是初始化新创建的对象。构造方法与类名相同,没有返回类型,也不需要在方法签名中声明void。了解和熟练使用构造方法是Java面向对象编程的...

    浅谈Java程序中的构造方法调用.pdf

    当父类和子类都定义了构造方法时,如果父类的构造方法初始化父类定义的成员,子类的构造方法初始化子类定义的成员,在创建子类的对象时,这两个构造方法都要执行。这种情况下,必须在子类的构造方法中使用关键字 ...

    Python子类继承父类构造函数详解

    如果子类没有定义自己的构造函数(即没有定义`__init__`方法),那么在实例化子类时,Python会自动调用父类的构造函数来初始化对象。例如: ```python class Son(Father): def getName(self): return 'Son' + ...

    java 子类构造方法

    在Java编程语言中,子类继承父类时,构造方法起着至关重要的作用。它们用于初始化对象,并在创建新实例时执行特定的设置步骤。理解如何在子类中使用构造方法是掌握面向对象编程的关键部分。本文将深入探讨Java子类...

    Java中构造方法的深入研究与探讨.pdf

    本文探讨了 Java 中构造方法的概念、特点和应用,通过对构造方法的深入研究和探讨,阐述了其在继承和设计模式中的重要作用。 知识点一:构造方法的概念和特点 构造方法是 Java 中一个特殊的方法,它用来初始化对象...

    Java 构造方法

    4. **作用**:构造方法的主要任务是初始化对象的状态,通过给实例变量赋值。 5. **参数**:构造方法可以带有参数,这样可以根据不同的参数值创建具有不同初始状态的对象。这称为重载构造方法,即在同一个类中定义多...

Global site tag (gtag.js) - Google Analytics