网站首页 > java教程 正文
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.构造函数、构造方法、构造器
构造函数、构造方法和构造器三者是一回事。
以后我们就统一叫“构造方法”。
构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
我们接着上一章例子来看:
这是创建Student对象,调用了Student类的构造方法。
2.默认的构造方法
既然调用了Student类的构造方法,我们就去看看Student类:
我们发现只有一个info方法,并没有什么构造方法。
这里需要注意的是:编译器自动为没有构造方法的任何类提供无参数的默认构造方法。此默认构造方法将调用父类的无参数构造方法。在这种情况下,如果父类没有无参构造方法,编译器会报错,因此我们必须验证它是否存在。如果你的类没有明确的父类,那么它有一个隐含的父类Object,它确实有一个无参数的构造方法。
由此看来,我们Student类没有显式的指定父类,但隐式继承了一个父类Object。
看一下Object类:
之前我们也看过Object类,当时看的是它里面的toString方法。
我们默认的构造方法回去调用父类的构造方法,看下Object的构造方法:
父类Object的构造方法无参无返回值。
3.显式的构造方法
我们自己也可以定义一个显示的构造方法。
构造方法定义格式:
访问修饰符:public、protected、private、默认的访问修饰符。
类名:构造方法的名称必须与类名一致。
参数列表:形参类型 形参名称
{}:方法体
演示:
定义Student类构造方法。
实现:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
4.访问修饰符public
public:表示紧随其后的元素对任何人都是可用的。
演示:
在Student类中,使用public修饰构造方法。
实现:
Student类:
Main类:
结果:
从运行结果来看,正确无误。运行过程中也没有发现错误。
5.访问修饰符protected
protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。
因为需要继承才能演示出效果,所以我们再定义一个父类。继承的详细信息后面再讲,这里演示需要,我们先用着。
演示:
定义一个父类People。Student类继承People类。
在People类中,使用protected修饰构造方法,方法体显示输出类中所有字段。在Main类中调用Student对象该方法。
实现:
People类:
Student类:
Main类:
结果:
被protected修饰的元素只能被子类所使用。
Student是People的子类,子类的构造方法会自动地调用父类构造方法,子类没有构造方法时编译器会自动给子类加一个默认的无参构造方法,然后子类的构造方法回去调用父类的构造方法。
我们给子类Student加一个构造方法,作如下修改即可:
Student类:
Main类无需修改。
结果:
这次运行结果完全正确。
先调用的父类构造方法,再调用的子类构造方法。
6.访问修饰符private
private:表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你跟客户端程序猿之间的一堵墙,如果有人试图访问private成员,就会在编译时得到错误信息。
演示:
在Student类中,使用public修饰构造方法。
实现:
Student类:
Main类:
运行过程中出现错误:
错误信息:
文字版:
Error:(9, 27) java: Student() 在 lab.Student 中是 private 访问控制
被private修饰的构造方法,不能被外界创建对象。但是它有应用场景,例如:单例对象。整个内存中只存在一个对象。
单例对象
实现:
Student类:
Main类:
结果:
这里只是简单的演示单例对象,后面讲设计模式的时候给大家介绍单例设计模式再详细讲解。
5.默认的访问修饰符
Java还有一种默认的访问权限,当没有使用前面提到的任何访问指定名词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类成员,但是在包之外,这些成员如同指定了private一样。
演示:
在Student类中,使用默认的访问修饰符修饰构造方法。
实现:
Student类:
Main类:
结果:
运行过程中,发生错误:
文字版:
Error:(9, 27) java: Student()在lab.Student中不是公共的; 无法从外部程序包中对其进行访问
默认的访问修饰符的范围是同一个包。所以,将Student类移至Main类包下即可:
结果:
同一个包下的类可以访问被默认访问修饰符修饰的元素。
8.构造方法重载
在Java中,允许有多个方法名相同的方法,但是参数列表必须独一无二,这个特性叫方法的重载。
演示:
在new Student对象的同时,我希望设置其字段的值,通过构造方法传入。
实现:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
9.唯一的有参构造方法
如果类中只有一个有参构造方法,那么创建对象时,你只能使用这个构造方法,因为当我们自己显式编写了构造方法之后,编译器就不会帮我们自动添加一个无参构造方法。
演示:
Student类中只有一个有参的构造方法,然后创建其对象。
实现:
Student类:
Main类:
结果:
运行过程中出现错误:
文字版:
Error:(9, 27) java: 无法将类 lab.Student中的构造器 Student应用到给定类型;
需要: java.lang.String
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
Error:(19, 28) java: 无法将类 lab.Student中的构造器 Student应用到给定类型;
需要: java.lang.String
找到: java.lang.String,int
原因: 实际参数列表和形式参数列表长度不同
Error:(24, 28) java: 无法将类 lab.Student中的构造器 Student应用到给定类型;
需要: java.lang.String
找到: java.lang.String,int,int
原因: 实际参数列表和形式参数列表长度不同
其他创建Student对象方式是错误的,只有一个方式是对的,那就是:
因为构造方法只有唯一的一个,你就只能这样创建对象。
10.类中至少要有一个构造方法
类里面至少要有一个构造方法。
用private修饰构造方法不叫没有构造方法。而是将构造方法私有化。
总结
- 构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
- 编译器自动为没有构造方法的任何类提供无参数的默认构造方法。此默认构造方法将调用父类的无参数构造方法。在这种情况下,如果父类没有无参构造方法,编译器会报错,因此我们必须验证它是否存在。如果你的类没有明确的父类,那么它有一个隐含的父类Object,它确实有一个无参数的构造方法。
- 构造方法可以重载。
- 类中至少要有一个构造方法。
至此,Java中构造函数、构造方法、构造器相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第四十章:this关键字
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
猜你喜欢
- 2024-10-17 Java|剖析类内的五类成员:属性、方法、构造器、代码块、内部类
- 2024-10-17 C++|构造、析构、成员(静态、非静态)函数、友元、全局函数
- 2024-10-17 JavaScript构造函数和原型:构造函数和原型 原创
- 2024-10-17 灵魂拷问:创建 Java 字符串,用""还是构造函数
- 2024-10-17 dart系列之:dart类中的构造函数(dart命名构造函数)
- 2024-10-17 Java面试题#构造函数和Setter哪种DI方式更好
- 2024-10-17 「php」construct() 函数介绍与使用方法详解
- 2024-10-17 为什么不允许使用 Java 静态构造函数?
- 2024-10-17 关于构造函数的Java面试问题(关于构造函数的java面试问题有哪些)
- 2024-10-17 编程语言Java如何创建对象,看完秒懂
你 发表评论:
欢迎- 05-15java使用iText解析PDF文件
- 05-15java 将pdf 形成的图片,每页一张图片 保存为pdf文件
- 05-15Java学习123——虚拟方法调用(Virtual Method Invocation)
- 05-15什么是JNI?为什么会有Native层?如何使用?
- 05-15Socket通信
- 05-15译文:理解Java中的弱引用
- 05-15Java 调用 DeepSeek 模型的完整示例及特点
- 05-15Java 对象和类
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)