Java 关于类的构造方法的一点认识
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 关于类的构造方法的一点认识的更多相关文章
- Java final类&所有构造方法均为private的类(类型说明符&访问控制符)
1. final是类型说明符,表示关闭继承,即final类不能有子类: 但final类可能可以在类外创建对象(即final类的构造方法可以不是private型): 在同一包中时,可以在任何另外一个类中 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- Java之面向对象概述,类,构造方法,static,主方法,对象
一.面向对象概述 面向过程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响 ...
- Java :BufferedWriter类和BufferedReader类的构造方法、主要方法
BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高. 一.BufferedWriter 类 构造方法:buffered ...
- Java中Io类-File类的构造方法
package com.hxzy.IOSer;import java.io.*;public class Demo02 { public static void main(String[] args) ...
- Java自学-类和对象 构造方法
怎么使用 Java 构造方法? 通过一个类创建一个对象,这个过程叫做实例化 实例化是通过调用构造方法(又叫做构造器)实现的 步骤 1 : 什么是构造方法 方法名和类名一样(包括大小写) 没有返回类型 ...
- java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...
- JAVA:类,对象,成员属性,成员方法,构造方法,类变量,类方法<2>
一.类的定义 一个全面的类定义是比较复杂的, 定义如下:
- java——调用一个静态方法的时候有没有执行这个类的构造方法,以及这个类中的静态常量?
尝试一下: public class Try { final static int a = 1; public Try() { System.out.print("构造方法"); ...
随机推荐
- 【MT】牛津的MT教程
Preamble This repository contains the lecture slides and course description for the Deep Natural Lan ...
- Python 实现 Html 转 Markdown(支持 MathJax 数学公式)
因为需要转 html 到 markdown,找了个 python 的库,该库主要是利用正则表达式实现将 Html 转为 Markdown. 数学公式需要自己修改代码来处理. 我 fork 的项目地址: ...
- DDCTF-2019
Web 滴 Web 签到题 Web 大吉大利,今晚吃鸡 1)滴 网址http://117.51.150.246/index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz ...
- Djnago框架组成
Django.core 核心处理库由以下组成: (1)url分析.请求处理.缓存等. Django.conf Django.conf的主要作用有: (1)处理全局配置,如数据库.加载应用.middle ...
- 2018-2019-2 《Java程序设计》第7周学习总结
20175319 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习<Java程序设计>第8章: 1.String类: Java专门提供了用 ...
- 编译VisualVM源码解决乱码问题
编译VisualVM源码解决乱码问题 起因 今天在使用VisualVM对测试服务器进行JVM监控的时候,发现所有统计图的横纵坐标都是显示乱码(小方块),即使我的Ubuntu系统使用的是英文语言环境.奇 ...
- Asp.net core 3.0
序言 我的看法:如果你未来五到十年还打算靠 ASP.NET 吃饭,ASP.NET MVC 一定要学,写 WebForm 工作机会将变得很少,具备 MVC 技能才有本钱跟年轻小伙子们抢饭碗,很高比例的 ...
- Aras SP9里打开自己写的网页。
首先把自己写的网页挂在IIS里或者网站挂到IIS里面. 然后再Aras里新增method //网页参数 var dialogArguments = new Array(); //窗体参数 var op ...
- 小程序bindtap和cachetap的区别
<view bindtap='a'> 1 <view bindtap='b'> 2 <view bindtap='c'> 3 </view> </ ...
- Nodejs一键实现微信内打开网页url自动跳转外部浏览器访问的功能
前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...