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. 【THUSC2017】【LOJ2979】换桌 线段树 网络流

    题目大意 有 \(n\) 个圆形的桌子排成一排,每个桌子有 \(m\) 个座位. 最开始每个位置上都有一个人.现在每个人都要重新选择一个座位,第 \(i\) 桌的第 \(j\) 个人的新座位只能在第 ...

  2. loj2977 巧克力 (斯坦纳树+随机化)

    考虑颜色比较少的时候,第一问可以直接斯坦纳树 第二问考虑二分,每次把每格的权值给成1000+[a[i]>m],就是在个数最少的基础上尽量选小于等于m的 然而颜色太多不能直接做,但可以把每种颜色映 ...

  3. practice01

    1. 组合数公式: C(n, k) =C(n-1, k) +C(n-1, k-1) 要求利用该公式写递归函数求组合数. #include <stdio.h> int C(int a,int ...

  4. STL初始化initializer_list

    #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  5. netty的基本介绍

    一.什么是netty?为什么要用netty netty是jboss提供的一个java开源框架,netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可用性的网络服务器和客户端程 ...

  6. Redis非关系型数据库

    1.简介 Redis是一个基于内存的Key-Value非关系型数据库,由C语言进行编写. Redis一般作为分布式缓存框架.分布式下的SESSION分离.分布式锁的实现等等. Redis速度快的原因: ...

  7. [Android] Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotations.xml

    Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符. ...

  8. Web开发常见安全问题

    转载自: http://blog.csdn.net/fengyinchao/article/details/50775121 不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过 ...

  9. APK改之理 手游修改改编安卓程序工具安装使用教程

    APK改之理 手游修改改编安卓程序工具安装使用教程 --APK破解付费程序 apk改之理是pc平台上一款非常好用的apk反编译工具,他将反编译以及签名等功能集中在一起,并且拥有非常人性化的操作界面,如 ...

  10. github 远程库

    一.在 Github 创建 django 项目时:先在本地创建项目,然后设置为本地仓库,再与远程仓库关联 在 Git Bash 进入django项目目录,输入命令git init,此时这个目录变成Gi ...