2019年4月21日 星期天

在ORACLE官网上提供的The Java™ Tutorials中,有一节课Providing Constructors for Your Classes(为你的类提供构造方法)中提到:

You don't have to provide any constructors for your class, but you must be careful when doing this. The compiler automatically provides a no-argument, default constructor for any class without constructors. This default constructor will call the no-argument constructor of the superclass. In this situation, the compiler will complain if the superclass doesn't have a no-argument constructor so you must verify that it does. If your class has no explicit superclass, then it has an implicit superclass of Object, which does have a no-argument constructor.

首先,看:“You don't have to provide any constructors for your class, but you must be careful when doing this. The compiler automatically provides a no-argument, default constructor for any class without constructors. This default constructor will call the no-argument constructor of the superclass.”

这段话的大意是:“你不必为你的类提供任何构造方法,但是当这样做的时候,你必须小心。编译器会自动为没有构造方法的任何类提供一个无参的、默认的构造方法。这个默认的构造方法将会调用父类的无参构造方法。”

我们通过一个代码示例来理解这段话吧!

以下提供的示例分别在Eclipse、IntelliJ IDEA运行。

 public class Main {

     public static void main(String[] args) {
MySubclass mySubclass = new MySubclass();
}
} class MySuperclass {
// 无参构造方法
public MySuperclass() {
System.out.println("I am your superclass.");
} // 带参数构造方法
public MySuperclass(String today) {
System.out.println(today);
}
} class MySubclass extends MySuperclass { }

运行结果,输出:

I am your superclass.

奇怪,为什么运行这个程序之后,会输出“I am your superclass.”呢?在main(String[] args)方法中,并没有见到任何打印方法!

其实,这正是上文提到的:“编译器会自动为没有构造方法的任何类提供一个无参的、默认的构造方法。这个默认的构造方法将会调用父类的无参构造方法。”

在第20~22行,声明了一个MySubclass类,而且这个类是继承自MySuperclass类。因为在MySubclass中没有明确地声明任何构造方法,所以,编译器会自动为这个类添加一个无参的、默认的构造方法。而这个无参的、默认的构造方法,则是来自于父类(MySuperclass)。

在第4行,首先创建一个MySubclass对象(new MySubclass();),随后,编译器发现MySubclass类自身没有声明任何构造方法,但它是继承自MySuperclass类。于是,编译器检查一下MySuperclass类,发现MySuperclass类中声明了两个构造方法,其中一个是无参的构造方法(MySuperclass())。唉!自己(MySubclass类)没有构造方法,那只能调用父类的无参的构造方法了。

所以,运行这个程序,就会在控制台输出:“I am your superclass.”。这正是因为MySubclass类的对象调用MySuperclass类的无参的构造方法的缘故。(好绕!)

接着,看:“In this situation, the compiler will complain if the superclass doesn't have a no-argument constructor so you must verify that it does.”

这段话的大意是:“在这种情况下,如果父类中没有一个无参的构造方法,编译器将会控诉(发出错误提示),因此你必须检查父类是否提供一个无参的构造方法。”

我们修改上文的代码示例,看看编译器会有什么反应吧!

将第10~12行的代码注释掉之后,既MySuperclass类不提供无参的、默认的构造方法。

Eclipse在第20行给出这样的错误提示:“Implicit super constructor MySuperclass() is undefined for default constructor. Must define an explicit constructor”,这句话的大意是:没有定义一个默认的构造方法MySuperclass(),必须定义一个明确的构造方法。

其实,这就是上文提到:“如果父类中没有一个无参的构造方法,编译器将会控诉(发出错误提示)。”

理解能力有限,有一些翻译可能存在歧义而误导大家,欢迎指正!

未完待续。

Java 关于类的构造方法的一点认识的更多相关文章

  1. Java final类&所有构造方法均为private的类(类型说明符&访问控制符)

    1. final是类型说明符,表示关闭继承,即final类不能有子类: 但final类可能可以在类外创建对象(即final类的构造方法可以不是private型): 在同一包中时,可以在任何另外一个类中 ...

  2. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  3. Java之面向对象概述,类,构造方法,static,主方法,对象

    一.面向对象概述 面向过程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响 ...

  4. Java :BufferedWriter类和BufferedReader类的构造方法、主要方法

    BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高. 一.BufferedWriter 类 构造方法:buffered ...

  5. Java中Io类-File类的构造方法

    package com.hxzy.IOSer;import java.io.*;public class Demo02 { public static void main(String[] args) ...

  6. Java自学-类和对象 构造方法

    怎么使用 Java 构造方法? 通过一个类创建一个对象,这个过程叫做实例化 实例化是通过调用构造方法(又叫做构造器)实现的 步骤 1 : 什么是构造方法 方法名和类名一样(包括大小写) 没有返回类型 ...

  7. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  8. JAVA:类,对象,成员属性,成员方法,构造方法,类变量,类方法<2>

    一.类的定义 一个全面的类定义是比较复杂的,  定义如下:

  9. java——调用一个静态方法的时候有没有执行这个类的构造方法,以及这个类中的静态常量?

    尝试一下: public class Try { final static int a = 1; public Try() { System.out.print("构造方法"); ...

随机推荐

  1. Plctext 如何发送默认的模式

    当切屏指令都没有的情况下,就会发,即:当65这个地址位(0-7),都为零的情况下.

  2. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  3. Ticwatch2_3G版省电优化

    设置 --> 网络与连接 --> 云消息同步(禁用) 设置 --> 声音与震动 --> 铃声与音量(静音) 设置 --> 声音与震动 --> 闹钟音量(静音) 设置 ...

  4. vim打开退出命令

    打开文件方法:cd /Users/liuchang/.jenkins/secrets && vim initialAdminPassword 退出方法:先按ESC,再输入冒号,在输入命 ...

  5. 2019年6月pmp考试马上开始!报考9月怎么进行中文报名?

    2019年6月pmp考试马上开始了,现在还可不可以报名参加考试呢?来不来得及呢?怎么进行中文报名,考点在哪里?如果现在想报考9月怎么进行中文报名?下面慧翔天地就给大家分享! (关于甘特图的画法,项目管 ...

  6. java day01记录

    详细记录见本地基础培训资料 一.数据类型 /* 数据类型:Java是一种强类型语言,针对每一种数据都给出了明确的数据类型. 数据类型分类: A:基本数据类型 B:引用数据类型(类,接口,数组) 基本数 ...

  7. Springboot集成Quartz

    之前学习过spring的定时任务 :https://www.cnblogs.com/slimshady/p/10112515.html 本文主要学习记录下springboot使用quartz 1.   ...

  8. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  9. JGUI源码:实现简单进度条(19)

    程序效果如下 实现进度条动画主要有两种方法:(1)使用缓动,(2)使用Jquery Animate,本文使用第二种方法,先实现代码,后续进行控件封装 <style> .jgui-proce ...

  10. JGUI源码:实现简单MVVM单项绑定学习笔记(15)

    前面几节都是jquery界面方面的东西,本节研究些数据方面的东西:MVVM. MVVM由三部分组成:Model <=> ViewModel <=> View,当Model数据改 ...