Java 基础——构造器和方法的区别
构造函数(构造器)是一种特殊的函数。其主要功能是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数与类名相同,可重载多个不同的构造函数。在Java语言中,构造函数与C++语言中的构造函数相同,JAVA语言中普遍称之为构造方法。
- 构造方法的声明:
- 修饰符 class_name(类名) (参数列表){
- 逻辑代码
- }
构造器特性:
1.如果我们的类当中没有定义任何构造器,系统会给我们默认提供一个无参的构造器。
2.如果我们的类当中定义了构造器,那么系统就不会再给我们提供默认的无参构造器。
作用:构建创造一个对象。同时可以给我们的属性做一个初始化操作。
下面主要学习构造器和方法的区别:
我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的。下面将简单介绍一下 ,最后用一个表作了些简单的总结。
1、功能和作用的不同
构造器是为了创建一个类的实例。用来创建一个对象,同时可以给属性做初始化。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus();
相反,方法的作用是仅仅是功能函数,为了执行java代码。
2、修饰符,返回值和命名的不同
构造器和方法在下面三个方便的区别:修饰符,返回值,命名。
和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized。
3、返回类型
方法必须要有返回值,能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。
4、命名
构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。
构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。
5、调用:
构造方法:只有在对象创建的时候才会去调用,而且只会调用一次。
一般方法:在对象创建之后才可以调用,并且可以调用多次。
6、"this"的用法
构造器和方法使用关键字this有很大的区别。方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码:
- public class Platypus {
- String name;
- Platypus(String input) {
- name = input;
- }
- Platypus() {
- this("John/Mary Doe");
- }
- public static void main(String args[]) {
- Platypus p1 = new Platypus("digger");
- Platypus p2 = new Platypus();
- }
- }
在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员name赋值,第二个构造器,调用第一个构造器,给成员变量name一个初始值 "John/Mary Doe".
在构造器中,如果要使用关键字this,那么,必须放在第一行,如果不这样,将导致一个编译错误。
7、"super"的用法
构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。看下面的例子:
- class Mammal {
- void getBirthInfo() {
- System.out.println("born alive.");
- }
- }
- class Platypus extends Mammal {
- void getBirthInfo() {
- System.out.println("hatch from eggs");
- System.out.print("a mammal normally is ");
- super.getBirthInfo();
- }
- }
在上面的例子中,使用super.getBirthInfo()去调用超类Mammal中被重载的方法。
构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。看下面的例子:
- public class SuperClassDemo {
- SuperClassDemo() {}
- }
- class Child extends SuperClassDemo {
- Child() {
- super();
- }
- }
在上面这个没有什么实际意义的例子中,构造器 Child()包含了 super,它的作用就是将超类中的构造器SuperClassDemo实例化,并加到 Child类中。
编译器自动加入代码
编译器自动加入代码到构造器,对于这个,java程序员新手可能比较混淆。当我们写一个没有构造器的类,编译的时候,编译器会自动加上一个不带参数的构造器,例如:public class Example {}
编译后将如下代码:
- public class Example {
- Example() {}
- }
在构造器的第一行,没有使用super,那么编译器也会自动加上,例如:
- public class TestConstructors {
- TestConstructors() {}
- }
编译器会加上代码,如下:
- public class TestConstructors {
- TestConstructors() {
- super;
- }
- }
仔细想一下,就知道下面的代码
- public class Example {}
经过会被编译器加代码形如:
- public class Example {
- Example() {
- super;
- }
- }
8、继承
构造器是不能被继承的。子类可以继承超类的任何方法。看看下面的代码:
- public class Example {
- public void sayHi {
- system.out.println("Hi");
- }
- Example() {}
- }
- public class SubClass extends Example {
- }
类 SubClass 自动继承了父类中的sayHi方法,但是,父类中的构造器 Example()却不能被继承。
总结:
主题 | 构造器 | 方法 |
---|---|---|
功能 | 建立一个类的实例 | java功能语句 |
修饰 |
不能用bstract , final , native ,static , or synchronized
|
能 |
返回类型 | 没有返回值,没有void |
有返回值,或者void
|
命名 | 和类名相同;通常为名词,大写开头 | 通常代表一个动词的意思,小写开头 |
this
|
指向同一个类中另外一个构造器,在第一行 | 指向当前类的一个实例,不能用于静态方法 |
super
|
调用父类的构造器,在第一行 | 调用父类中一个重载的方法 |
继承 | 构造器不能被继承 | 方法可以被继承 |
编译器自动加入一个缺省的构造器 | 自动加入(如果没有) | 不支持 |
编译器自动加入一个缺省的调用到超类的构造器 | 自动加入(如果没有) | 不支持 |
Java 基础——构造器和方法的区别相关推荐
- Java基础之equals和==的区别深入解析
Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...
- java基础之main方法解读:java的主函数
java基础之main方法解读: 一.深入理解main方法:(由java虚拟机调用) 解释main方法的形式:public static void main (String [] args){} 1. ...
- JAVA中构造器和方法的区别点
要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别. 下面将简单介绍一下 ,最后用一个表作了些简单的总结. 功能和作用的不 ...
- Java基础+流程控制+方法+数组【笔记含代码】
文章目录 什么是计算机 计算机硬件 计算机软件 DOS命令 计算机语言发展史 第一代语言 第二代语言 第三代语言 Java帝国的诞生 C & C++ 反抗 Java初生 Java发展 Java ...
- 【java基础18:方法覆盖与多态】什么时候使用方法覆盖 toString方法的覆盖 多态的基础语法与作用 向上/向下转型
目录 方法覆盖Override 多态 方法覆盖Override 方法覆盖初体验,什么样的程序要方法覆盖 /*当前程序存在的问题(设计上的问题)??鸟儿在执行move()方法的时候,最好输出的结果是:& ...
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...
- java substr函数_oracle 中的substr()函数的用法,以及与java中String.substring()方法的区别...
oracle 中的substr()函数的规则是 substr( string, start_position, [ length ] ) 说明: string 是要分割的字符串 start_posit ...
- Java基础篇:方法重载
在Java中,同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可.在这种情况下,该方法就被称为重载(overloaded),这个过程称为方法重载(methodoverload ...
- Java基础——重写toString()方法
1.Object()类的toString() Java默认的toString方法来自Object类 在Java中每个类都直接或者间接继承Object类,toString()方法同样是来自于Object ...
最新文章
- 机器学习+优化问题的种类、如何优化、凸优化、非凸优化、对偶问题、KKT条件
- 信息熵是什么 转 理论吃透的创新解释
- Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转
- 理解Java操作数据库原理
- 谷歌如何获取了我们的个人数据?
- 验1-8 输出倒三角图案 (5 分)
- 面试题:+=(python中列表+=操作)
- 华为手机如何给应用加锁_华为手机正确防止应用后台运行被清理的操作方法
- 读react.js小书 抽象公共组件类
- mac移动硬盘安装linux系统安装教程,移动硬盘上安装ubuntu系统
- python numpy读取txt文件_使用NumPy读写文件
- Primeng PrimeFlex 的使用总结 (Angular 10)
- Electron主进程渲染进程间通信的四种方式
- [百度笔试]百度笔试大集锦
- (2012.12.25)我的中级软件设计师考试
- 复试编程训练真题——C语言,统计各单词(字符)出现的次数,并将各单词(字符)和其出现的次数输出到屏幕和文件中
- mac protobuf java_mac 下 使用 protobuf 生成 java 及 js 及配合socket.io 使用
- 剑指offer109:开密码锁
- 邂逅JVM中的Bug
- vue3 element plus el-input 无法输入问题