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. 「Manacher算法」学习笔记

    觉得这篇文章写得特别劲,插图非常便于理解. 目的:求字符串中的最长回文子串. 算法思想 考虑维护一个数组$r[i]$代表回文半径.回文半径的定义为:对于一个以$i$为回文中心的奇数回文子串,设其为闭区 ...

  2. 【BZOJ2721】樱花(数论)

    [BZOJ2721]樱花(数论) 题面 BZOJ 题解 先化简一下式子,得到:\(\displaystyle n!(x+y)=xy\),不难从这个式子中得到\(x,y\gt n!\). 然后通过\(x ...

  3. luogu5290 春节十二响

    题目链接 思路 先考虑一条链的情况怎么做. 因为只有两个子树,并且两个子树都是链.所以可以把这两条链找出来,然后\(sort\)一下.合并起来. 然后推广到树上 对于每一棵树都可以按照和上面同样的方法 ...

  4. mysql 在visual studio中的配置

    视图-->其他窗口-->服务器资源管理器-->数据连接-->右键添加连接 servername:localhost username:root password:123456 ...

  5. 解决input框自动填充为黄色的问题

    题原因:input 框会自动填充一个颜色  如图所示  解决方法 :通过动画去延迟背景颜色的显示  代码如下 input:-webkit-autofill, textarea:-webkit-auto ...

  6. Python并发编程之多线程使用

    目录 一 开启线程的两种方式 二 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 三 练习 四 线程相关的其他方法 五 守护线程 六 Python GIL(Global Interpret ...

  7. 获取windows凭证管理器明文密码

    1.运行cmdkey /list查看windows保存凭证 方法1.mimikaz mimikatz vault::cred 2.利用powershell尝试获取 windows 普通凭据类型中的明文 ...

  8. Error:java: 无效的目标发行版: 1.8

    出现问题: Error:java: 无效的目标发行版: 1.8 解决方法: file-setting--

  9. 1.7分布式工具配置及安装(仅供学习Xshell,VMware)

    前言 最近因为换工作以及其他的一些琐事,耽误了更博时间,再加上分布式的这几个软件之前没撸过....这学习这几个工具上也花了点时间 本篇博客为后续分布式的学习提供基础的安装和配置. 首先,系统为Cent ...

  10. hadoop记录-hadoop集群日常运维命令

    hadoop集群日常运维命令 #1.namenode hadoop namenode -format #格式化,慎用 su hdfs hadoop-daemon.sh start namenode h ...