Simple Admin 分布式后台管理系统 v0.1.6 发布
本次更新内容: 1. 升级文件服务版本至 1.1.6, 文件服务默认ORM改为Ent, GORM移至gorm分支 2. 优化数据库配置文件,提高代码复用性 3. 更新文件服务文档 4. 错误信息国际化全部移至i18n处理 5. 修复用户下线token过期bug 6. 优化验证器国际化例子 未来将提供: 基于Ent的crud代码生成
摘要:Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。
本文分享自华为云社区《一文带你了解 Java 中的构造器》,作者: 宇宙之一粟 。
C ++ 引入了构造器(constructor,也叫构造函数)的概念,它是在创建对象时被自动调用的特殊方法。
Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。
在 Java 中,可以通过编写构造器来确保每个对象的初始化。但是这里有两个问题:
C++ 语言采用的方案就是将构造器和类的名字定义相同,Java 也采用了这个方案。
构造器的作用是用来建立一个新的类的实例,当一个对象被创建时,JVM 使用一个构造函数,并为其分配内存空间。
class ClassName {
ClassName() {
}
}
例如,在下面的示例中,我们创建了一个名为 ReLearnConstructor 的构造函数。在构造函数内部,我们正在初始化 hello 变量的值。:
public class ReLearnConstructor {
String hello; // 属性
// 构造器
public ReLearnConstructor() {
hello = "Hello, Constructor!";
}
public static void main(String[] args) {
ReLearnConstructor rc = new ReLearnConstructor();
System.out.println(rc.hello);
}
}
注意创建 ReLearnConstructor 类的对象的语句:ReLearnConstructor rc = new ReLearnConstructor();
在这里,当创建对象时,调用 ReLearnConstructor 构造函数。并且,hello 变量的值被初始化。
因此打印的 hello 的值为:
构造函数的目的是初始化对象的状态,为所有声明的属性赋值。如果我们没有自定义构造函数,JVM 就会为这些属性分配默认值。
原始类型的默认值:
对于其他 Java 引用类型,默认值是null,这意味着引用类型的属性没有被分配任何值。
后面可以用代码查看这些默认值。
在 Java 中,有三种类型的构造器:
与方法类似,Java 构造函数可能有参数,也可能没有任何参数。如果构造函数不接受任何参数,则称为无参数构造器。例如上述代码中 ReLearnConstructor 构造器就是:
// 无参构造器
public ReLearnConstructor() {
hello = "Hello, Constructor!";
}
字面理解,具有参数的构造函数称为有参数构造器。那为什么需要使用有参构造器?
有参构造器可用于为不同对象提供不同初始化的值。 例如:
public class ReLearnConstructor {
String languages;
// 接受单个参数的构造器
public ReLearnConstructor(String lang) {
languages = lang;
System.out.println("我在学习 " + languages + " 语言!");
}
public static void main(String[] args) {
// 向构造器中传入不同的值
ReLearnConstructor rc1 = new ReLearnConstructor("Java");
ReLearnConstructor rc2 = new ReLearnConstructor("Go");
ReLearnConstructor rc3 = new ReLearnConstructor("Python");
}
}
运行结果:
如果我们不创建任何构造函数,Java 编译器会在程序执行期间自动创建一个无参数构造函数。这个构造函数称为默认构造函数。来看一个例子;
public class ReLearnConstructor {
String languages;
int a;
boolean b;
float c;
public static void main(String[] args) {
ReLearnConstructor rc = new ReLearnConstructor();
System.out.println("默认值:");
System.out.println("languages:" + rc.languages);
System.out.println("a:" + rc.a);
System.out.println("b:" + rc.b);
System.out.println("c:" + rc.c);
}
}
运行结果:
默认值:
languages:null
a:0
b:false
c:0.0
可以看到,我们还没有创建任何构造函数。因此,Java 编译器会自动创建默认构造函数。上述表格得以印证。
如果我们不用构造器来给属性赋值的话,可以先使用 new 运算符获取类的实例,并使用类的 setter 方法设置值,如下:
import java.util.Arrays;
class Person
{
private String name;
private int age;
@Override
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// getters
}
// Initialize an object in Java
class Main
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("Yuzhou1su");
person.setAge(22);
System.out.println(person);
}
}
通过构造器进行初始化就可以省去我们的 setter 方法。
如下的例子:
import java.util.Arrays;
class Person {
private String name;
private int age;
// 构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
}
class SimpleConstructor {
public static void main(String[] args) {
Person person = new Person("Yuzhou1su", 22);
System.out.println(person);
}
}
运行结果:
[Yuzhou1su, 22]
与 Java 方法重载类似,我们也可以创建两个或多个具有不同参数的构造函数。这称为构造函数重载。
public class ReLearnConstructor {
String language;
public ReLearnConstructor() {
this.language = "Java";
}
// 构造器
public ReLearnConstructor(String language) {
this.language = language;
}
public void getName() {
System.out.println("编程语言:" + this.language);
}
public static void main(String[] args) {
ReLearnConstructor rc1 = new ReLearnConstructor();
ReLearnConstructor rc2 = new ReLearnConstructor("Python");
rc1.getName();
rc2.getName();
}
}
在上面的例子中,我们有两个构造函数:ReLearnConstructor() 和 ReLearnConstructor(String language)。在这里,两个构造函数都用不同的值初始化变量语言的值。根据创建对象时传递的参数,调用不同的构造函数,分配不同的值。
运行结果:
编程语言:Java
编程语言:Python
Java 中的拷贝构造方法是一种使用该类的一个对象构造另外一个对象的构造方法。
复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象的副本。它只需要一个参数,它将是同一类的另一个实例。我们可以使用 this() 语句从复制构造函数中显式调用另一个构造函数:
public class ReLearnConstructor {
private String language;
// 构造器
public ReLearnConstructor(String language) {
this.language = language;
}
// 拷贝构造器
public ReLearnConstructor(ReLearnConstructor rc) {
this.language = rc.language;
}
public void getName() {
System.out.println("编程语言:" + this.language);
}
public static void main(String[] args) {
ReLearnConstructor rc = new ReLearnConstructor("Python");
ReLearnConstructor copyOfrc = new ReLearnConstructor(rc);
rc.getName();
copyOfrc.getName();
}
}
运行结果:
编程语言:Python
编程语言:Python
当需要拷贝一个带有多个成员变量的复杂对象或者想构造已存在对象的深拷贝对象时非常有用。
除了上文介绍的使用构造器的方法,另一种初始化对象的方法是使用“双大括号初始化”。这将创建一个匿名内部类,其中只有一个实例初始化程序。建议不要使用这种方法。
import java.util.Arrays;
class Person
{
private String name;
private int age;
@Override
public String toString() {
return Arrays.asList(name, String.valueOf(age)).toString();
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// getters
}
// Initialize an object in Java
class Main
{
public static void main(String[] args)
{
// Anonymous class
Person person = new Person() {{
// Initializer block
setName("Yuzhou1su");
setAge(22);
}};
System.out.println(person);
}
}
编译器会报如下错误:
Illegal modifier for the constructor in type ReLearnConstructor; only public, protected & private are permitted
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。