重温经典《Thinking in java》第四版之第五章 初始化与清理(二十九)

简介: 重温经典《Thinking in java》第四版之第五章 初始化与清理(二十九)

5.3 默认构造器,默认构造器就是无参构造器,它是没有形式参数的,作用你可以理解为创建一个默认对象。如果你的类中没有构造器,编译器会自动帮你创建一个默认构造器。例如:

classBird {} 
publicclassDefaultConstructor { 
publicstaticvoidmain(String[] args) { 
Birdb=newBird(); // Default!     } 
}

///:~  

new Bird() 创建了一个新对象,并调用默认构造器,即使你没有明确定义它。但是如果编译器不帮你自动创建它的话,就没有方法可调用,就无法创建对象了。如果你已经定义了一个构造器,编译器就不会帮你自动创建默认构造器。哪怕你定义的构造器就是无参构造器,那也是你自己定义的,你可以理解为你自己定义的无参构造器就是你替编译器做了创建默认构造器的工作。例如:

classBird2 { 
Bird2(inti) {} 
Bird2(doubled) {} 
} 
publicclassNoSynthesis { 
publicstaticvoidmain(String[] args) { 
//! Bird2 b = new Bird2(); // No default Bird2b2=newBird2(1); 
Bird2b3=newBird2(1.0); 
    } 
}

///:~

如果你使用new Bird2() 创建对象,编译器就会报错:没有找到匹配的构造器。

5.4 this关键字这一小节主要介绍了this关键字的作用。this关键字只能在类的方法内部使用,表示对“调用方法的那个对象”的引用。如果在方法内部调用同一个类的另一个方法,就不必使用this,但是往往我们会使用this.的形式去调用,可能习惯使然。所以什么情况下在视必须使用this的呢,答案是只有当需要明确指出对当前对象的引用时,才需要使用this关键字。例如,当需要返回当前对象的引用时,就常常在return语句里这样写:

publicclassLeaf { 
inti=0; 
Leafincrement() { 
i++; 
returnthis; 
    } 
voidprint() { 
System.out.println("i = "+i); 
    } 
publicstaticvoidmain(String[] args) { 
Leafx=newLeaf(); 
x.increment().increment().increment().print(); 
    } 
}

/* Output:

i = 3

*///:~

this关键字对于将当前一下传递给其他方法时也很有用:

classPerson { 
publicvoideat(Appleapple) { 
Applepeeled=apple.getPeeled(); 
System.out.println("Yummy"); 
    } 
} 
classPeeler { 
staticApplepeel(Appleapple) { 
// ... remove peel returnapple; // Peeled     } 
} 
classApple { 
ApplegetPeeled() { returnPeeler.peel(this); } 
} 
publicclassPassingThis { 
publicstaticvoidmain(String[] args) { 
newPerson().eat(newApple()); 
    } 
}

/* Output:

Yummy

*///:~

这种写法以后在编程技巧和设计模式以及开源框架中经常见到,也不能说是高级的用法,算是一种设计方法吧。

5.4.1 在构造器中调用构造器这一小节提到了this在构造器中调用其他构造器的用法,此时的this就相当于类的名字。这种用法往往在给一些有参构造器赋予默认值的时候经常用到:

importstaticnet.mindview.util.Print.*; 
publicclassFlower { 
intpetalCount=0; 
Strings="initial value"; 
Flower(intpetals) { 
petalCount=petals; 
print("Constructor w/ int arg only, petalCount= "+petalCount); 
    } 
Flower(Stringss) { 
print("Constructor w/ String arg only, s = "+ss); 
s=ss; 
    } 
Flower(Strings, intpetals) { 
this(petals); 
//! this(s); // Can’t call two! this.s=s; // Another use of "this" print("String & int args"); 
    } 
Flower() { 
this("hi", 47); 
print("default constructor (no args)"); 
    } 
voidprintPetalCount() { 
//! this(11); // Not inside non-constructor! print("petalCount = "+petalCount+" s = "+s); 
    } 
publicstaticvoidmain(String[] args) { 
Flowerx=newFlower(); 
x.printPetalCount(); 
    } 
}

/* Output:

Constructor w/ int arg only, petalCount= 47

String & int args

default constructor (no args)

petalCount = 47 s = hi

*///:~

this(hi,47)是在Flower()无参构造器中使用的,相当于调用了Flower(hi,47)。

“5.4.2 static的含义”,在了解了this关键字之后,就能更全面的了解static(静态)方法的含义了。static方法就是没有this的方法,属于类的方法。可以直接使用类名加点去调用一个类的静态方法,不需要借助对象,而且是属于全局的。

目录
相关文章
|
2月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
262 2
|
1月前
|
Java
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
|
2月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
140 3
|
2月前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
71 1
|
4月前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
4月前
|
存储 Java
如何在 Java 中初始化二维 ArrayList
【8月更文挑战第23天】
101 1
|
4月前
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + "BLACK"`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
|
4月前
|
存储 Java 编译器
如何在 Java 中初始化对象 Arraylist?
【8月更文挑战第23天】
134 0
|
4月前
|
存储 Java 开发工具
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
|
4月前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
65 0