[JAVA编程思想]chap4初始化和清除

大厂高级系统运维工程师经典面试题合集 正确答案: A解析 HCI 是计算、存储、网络融合部署,不是分离部署。正确答案: C解析 对于非最后一个分区的扩容,直接使用 virt-resize 可能导致分区表混乱。推荐使用 qemu-nbd 将镜像挂载为本地设备,再用 GParted 图形工具安全调整分区。回答正确 正确答案: B 你的答案: B解析 Docker Compose 的核心是通过单一 YAML 文件定义单机多容器应用的服务、网络、数据卷。 阅读详情

4.1 用构建器自动初始化

每个类都调用一次 initialize()。
在 Java 中,由于提供了名为“构建器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化。
构建器的名字与类名相同。
构建器也能使用自变量,以便我们指定对象的具体创建方式。利用构建器的自变量,我们可为一个对象的初始化设定相应的参数。

4.2 方法过载

为了让相同的方法名伴随不同的自变量类型使用,“方法过载”是非常关键的一项措施。

4.2.1 区分过载方法

每个过载的方法都必须采取独一无二的自变量类型列表

4.2.2 主类型的过载

在其他所有情况下,若我们的数据类型“小于”方法中使用的自变量,就会对那种数据类型进行“转型”处理。
若我们的自变量范围比它宽,就必须用括号中的类型名将其转为适当的类型。

4.2.3 返回值过载

4.2.4 默认构建器

若创建一个没有构建器的类,则编译程序会帮我们自动创建一个默认构建器。
如果已经定义了一个构建器(无论是否有自变量),编译程序都不会帮我们自动合成一个。

4.2.5 this 关键字

假定我们在一个方法的内部,并希望获得当前对象的句柄。由于那个句柄是由编译器“秘密”传递的,所以没有标识符可用。然而,针对这一目的有个专用的关键字:this。this 关键字(注意只能在方法内部使用)可为已调用了其方法的那个对象生成相应的句柄。

1.在构建器里调用构建器

若为一个类写了多个构建器,那么经常都需要在一个构建器里调用另一个构建器,以避免写重复的代码。可用this 关键字做到这一点。
由于自变量s 的名字以及成员数据s 的名字是相同的,所以会出现混淆。为解决这个问题,可用 this.s 来引用成员数据。
在print()中,我们发现编译器不让我们从除了一个构建器之外的其他任何方法内部调用一个构建器。

2. static 的含义

static意味着一个特定的方法没有this。我们不可从一个 static 方法内部发出对非 static 方法的调用,尽管反过来说是可以的。
若将一个 static 方法置入一个类的内部,它就可以访问其他static 方法以及static 字段。

4.3 清除:收尾和垃圾收集

一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用 finalize(),而且只有在下
一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。
C++的对象肯定会被清除(排开编程错误的因素),而Java 对象并非肯定能作为垃圾被“收集”去。

4.3.1 finalize()用途何在

垃圾收集只跟内存有关!

4.3.2 必须执行清除

Java 不允许我们创建本地(局部)对象——无论如何都要使用 new。
但在 Java 中,没有“delete”命令来释放对象,因为垃圾收集器会帮助我们自动释放存储空间。

4.4 成员初始化

一个类的所有基本类型数据成员都会保证获得一个初始值。

4.4.1 规定初始化

一个最直接的做法是在类内部定义变量的同时也为其赋值(注意在C++里不能这样做,尽管C++的新手们总“想”这样做)。

4.4.2 构建器初始化

若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static 对象。

4.5 数组初始化

数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起——采用一个统一的标识符名称。数组的定义和使用是通过方括号索引运算符进行的([])。为定义一个数组,只需在类型名后简单地跟随一对空方括号即可:
int[ ] al;
也可以将方括号置于标识符后面,获得完全一致的结果:
int al[ ];
为了给数组创建相应的存储空间,必须编写一个初始化表达式。
Java 数组从元素 0 开始计数,所以能索引的最大元素编号是“length-1”。
由于数组的大小是随机决定的(使用早先定义的pRand()方法),所以非常明显,数组的创建实际是在运行期间进行的。除此以外,从这个程序的输出中,大家可看到基本数据类型的数组元素会自动初始化成“空”值(对于数值,空值就是零;对于 char,它是 null;而对于boolean,它却是 false)。

4.5.1 多维数组

4.6 练习

1.使用未初始化的String引用创建一个类。 证明此引用由Java初始化为null。
package initialization;

public class E01_StringRefInitialization{
	String s;
	public static void main(String args[]){
		E01_StringRefInitialization sri=new E01_StringRefInitialization();
		System.out.println("sri.s="+sri,s);
	}
}
2.创建一个具有在定义点初始化的String字段的类,以及由构造函数初始化的另一个类。 这两种方法有什么区别?
package initialization;

public class E02_StringInitialization{
	String s1="Initialized at definition";
	String s2;
	public E02_StringInitialization(String s2i){
		s2=s2i;
	}
	public static void main(String args[]){
		E02_StringInitialization si=new E02_StringInitialization("Initialized at construction");
		System.out.println("si.s1="+si.s1);
		System.out.println("si.s2="+si.s2);
	}
}

在输入构造函数之前初始化s1字段; 从技术上讲,s2字段也是如此,在创建对象时将其设置为null。 更灵活的s2字段允许您在调用构造函数时选择赋予它的值,而s1总是具有相同的值。

3.使用默认构造函数(不带参数的构造函数)创建一个打印消息的类。 创建此类的对象。
package initialization;

public class E03_DefaultConstructor{
	E03_DefaultConstructor(){
		System.out.println("Default constructor");
	}
	public static void main(String args[]){
		new E03_DefaultConstructor();
	}
}
4.将重载的构造函数添加到练习3中,该构造函数接受String参数并将其与消息一起打印。
public class E04_OverloadedConstructor{
	E04_OverloadedConstructor(){
		System.out.println("Default constructor");
	}
	E04_OverloadedConstructor(String s){
		System.out.println("String arg constructor");
		System.out.println(s);
	}
	public static void main(String args[]){
		new E04_OverloadedConstructor();
		new E04_OverloadedConstructor("Overloaded");
	}
}
5.使用重载的bark()方法创建一个名为Dog的类。 您的方法应该根据各种原始数据类型重载,并且应该打印不同类型的barking,howling等,具体取决于调用哪个重载版本。 编写一个调用所有不同版本的main()。
class Dog{
	public void bark(){
		System.out.println("Default bark!");
	}
	public void bark(int i){
		System.out.println("int bark=howl");
	}
	public void bark(double d){
		System.out.println("double bark=yip");
	}
}

public class E05_OverloadedDog{
	public static void main(String args[]){
		Dog dog=new Dog();
		dog.bark();
		dog.bark(1);
		dog.bark(1.1);
	}
}
6.修改练习5,因此两个重载方法有两个不同类型的参数,但相对于彼此的顺序相反。 验证这是否有效。
7.创建一个没有构造函数的类,然后在main()中创建该类的对象,以验证是否自动合成了默认构造函数。

因为可以调用构造函数,所以即使您看不到它,也知道它已创建。

8.使用两种方法创建一个类。 在第一种方法中,调用第二种方法两次以查看它是否有效,第一次不使用此方法,第二次使用此方法。
public class E08_ThisMethodCall{
	public void a(){
		b();
		this.b();
	}
	public void b(){
		System.out.println("b() called");
	}
	public static void main(String args[]){
		new E08_ThisMethodCall().A();
	}
}

输出:

b() called 
b() called

此练习显示这指的是当前对象。 仅在必要时使用this.b()样式的方法调用; 否则你可能会混淆代码的读者/维护者。

9.创建一个包含两个(重载)构造函数的类。 使用它,在第一个内部调用第二个构造函数。
public class E09_ThisConstructorCall{
	public E09_ThisConstructorCall(String s){
		System.out.println("s="+s);
	}
	public E09_ThisConstructorCall(int i){
		this("i="+i);
	}
	public static void main(String args[]){
		new E09_ThisConstructorCall("String call");
		new E09_ThisConstructorCall(47);
	}
}
10.使用finalize()方法创建一个打印消息的类。 在main()中,创建一个类的对象。 解释你的程序的行为。
public class E10_FinalizeCall{
	protected void finalize(){
		System.out.println("finalize() called");
	}
	public static void main(String args[]){
		new E10_FinalizeCall();
	}
}
11.修改练习10,以便始终调用finalize()。

按顺序调用System.gc()和System.runFinalization()可能会但不一定会调用你的终结器(从一个版本的JDK到另一个版本,finalize的行为是不确定的。)对这些方法的调用只是一个请求; 它不能确保终结器实际运行。 最终,没有任何保证会调用finalize()。

12.创建一个名为Tank的类,可以填充和清空,其终止条件是在清理对象时必须为空。 写一个finalize()来验证这个终止条件。 在main()中,测试使用Tank时可能出现的情况。
class Tank{
	static int counter;
	int id=counter++;
	boolean full;
	public Tank(){
		System.out.println("Tank"+id+"created");
		full=true;
	}
	public void empty(){full=false;}
	protected void finalize(){
		if(full)
			System.out.println(
				"Error:tank"+id+"must be empty at cleanup");
		else
			System.out.println("Tank"+is+"cleaned up OK");
		public String toString(){return"Tank"+id;}
	}
	
	public class E12_TankWithTerminationCondition{
		public static void main(String args[]){
			new Tank().empty();
			new Tank();
			System.gc();                 //强迫finalization
			System.runFinalization();
		}
	}

我们没有创建对类型为Tank的两个实例的引用,因为当调用System.gc()时这些引用将在范围内,因此它们不会被清除,因此它们不会被最终确定。 另一种选择是在需要对垃圾进行垃圾收集时将引用设置为零。 修改上面的示例以尝试此方法。
你永远不能确定将调用终结器,因此它们的效用是有限的。 例如,终结器可以在运行时检查对象的状态,以确保它们已被正确清理。

14.创建一个具有静态String字段的类,该字段在定义点初始化,另一个由静态块初始化。 添加一个静态方法,打印两个字段并演示它们在使用之前都已初始化。
public class E14_StaticStringInitialization { 
	static String s1 = "Initialized at definition"; 
	static String s2; 
	static { s2 = "Initialized in static block"; } 
	public static void main(String args[]) { 
		System.out.println("s1 = " + s1); 
		System.out.println("s2 = " + s2); 
	} 
}
15.使用“实例初始化”初始化的String创建一个类。
public class E15_StringInstanceInitialization {
	String s; 
	{ s = "'instance initialization'"; } 
	public E15_StringInstanceInitialization() { 
		System.out.println("Default constructor; s = " + s); 
	} 
	public E15_StringInstanceInitialization(int i) { 
		System.out.println("int constructor; s = " + s); 
	} 
	public static void main(String args[]) { 
		new E15_StringInstanceInitialization(); 
		new E15_StringInstanceInitialization(1); 
	} 
}
16.为String对象数组的每个元素分配一个字符串。 使用for循环打印数组。
17.使用带有String参数的构造函数创建一个类。 在创建期间,打印参数。 创建对此类的对象引用数组,但不要创建要分配给数组的对象。 运行程序时,请注意是否打印了构造函数调用的初始化消息。
class Test { 
	Test(String s) { 
		System.out.println("String constructor; s = " + s); 
	} 
} 
public class E17_ObjectReferences { 
 // You can define the array as a field in the class: 
	Test[] array1 = new Test[5]; 
	public static void main(String args[]) { 
 // Or as a temporary inside main: 
		Test[] array2 = new Test[5]; 
	} 
}
18.创建要附加到练习17的引用数组的对象。
public class E18_ObjectArray { 
	public static void main(String args[]) { 
		Test[] array = new Test[5]; 
		for(int i = 0; i < array.length; i++) 
			array[i] = new Test(Integer.toString(i)); 
	} 
}

Integer.toString()返回表示指定整数的String对象。

19.编写一个采用vararg String数组的方法。 验证您是否可以将逗号分隔的字符串列表或字符串[]传递给此方法。
public class E19_VarargStringArray {
	static void printStrings(String... strs) { 
		for(String s : strs) 
		System.out.println(s); 
	} 
	public static void main(String args[]) { 
		printStrings("These", "are", "some", "strings"); 
		printStrings( 
			new String[] { "These", "are", "some", "strings" } 
		); 
	} 
}

NOTE:

for (String str : s){}

这种写法是增强for循环,

for(int i = 0;i < s.length(); i++){ 
String str = s[i]; //当成数组的写法
}

编译器会认为:
1.创建名称为str 的String变量。
2.将s的第一个元素赋给str 。
3.执行重复的内容。
4.赋值给下一个元素str 。
5.重复执行至所有的元素都被运行为止

优点:
这种写法让我们代码看起来更加的简洁
缺点话:
1只能顺次遍历所有元素,无法实现较为复杂的循环
2对于数组,不能方便的访问下标值;
3对于集合,与使用Interator相比,不能方便的删除集合中的内容(在内部也是调用Interator).
4 除了简单遍历并读取其中的内容外,不建议使用增强的for循环

20.创建一个使用varargs而不是普通main()语法的main()。 打印生成的args数组中的所有元素。 使用各种数量的命令行参数进行测试。
21.创建六种最低面值纸币的枚举。 循环遍历values()并打印每个值及其序数()。
enum PaperCurrencyTypes { 
	ONE, TWO, FIVE, TEN, TWENTY, FIFTY 
} 
public class E21_PaperCurrencyTypesEnum { 
	public static void main(String args[]) { 
		for(PaperCurrencyTypes s : PaperCurrencyTypes.values()) 
			System.out.println(s + ", ordinal " + s.ordinal()); 
	}	 
}
22.在练习21中为枚举写一个switch语句。对于每种情况,输出该特定货币的描述。
package initialization;
import static net.mindview.util.Print.*;

public class E22_PaperCurrencyTypesEnum2{
	static void describe(PaperCurrencyTypes pct){
		printnb(pvb+"has a portrait of");
		switch(pct){
			case ONE:print("George Washington");break;
			case Two:print("Thomas Jefferson");break;
			case Five:print("Abraham Lincoln");break;
			case TEN:print("Alexander Hamilton");break;
			case TWRNTY:print("Andrew Jackson");break;
			case SISTY:print("U.S. Grant");break;
		}
	}
	public static void main(String args[]){
		for(PaperCurrencyTypes s:PaperCurrencyTypes.values())
			describe(s);
	}
}
【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

相关推荐

科技中介如何高效匹配技术供需?.docx

科技中介如何高效匹配技术供需?

创建一个类,它包含一个在定义时就被初始化了的String域,以及另一个通过构造器初始化的String域。这两种方式有何差异

首先类demo类中定义了一个String的初始化后的String, 在定义了一个通过构造器初始化的String为null, 还定义了一个引用了构造器初始化的String a 通过打印出来的结果可以知道: 1.在定义时被初始化的String,在对象被实例化的时候被赋值引用。 2.在构造函数初始化的String,在对象被实例化的时候被赋值引用的是null,当构造函数初始化后才被赋值为he...

xiaozhuis000的博客 1644

!qhyb.rar

当 CAD 缺失对应字体时,图纸文字会显示异常,出现乱码、问号。将下载好的字体文件复制到 AutoCAD 的 Fonts 文件夹中,即可恢复正常显示。

java中重载与重写的区别

  首先我们来讲讲:重载(Overloading)     (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。     (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数不同的定义。 调用方法时通过传递给它们的不同参数个数参数类型...

weixin_34015566的博客 1338

Java 习题 (36)

解答: 创建一个名为Dog的类,它具有重载的bark() 方法。此方法应根据不同的基本数据类型进行重载,根据被调用的版本,让两个重载方法各自接受两个类型的不同的参数,但二者顺序相反。打印出不同类型的狗吠 (barking),咆哮 (howling) 等信息。编写 main() 来调用所有不同版本的方法。验证其是否工作。 解答: import java.util.*; class DogFive{ void bark(int i, boolean a){ System.out.pr

CHNMSCS 519

创建一个类,它包含一个在定义时就被初始化了的String域,以及另一个通过构造器初始化的域

public class Constructor1 { private String str = "nihao"; private String str1 = null; private String str2 = str1; Constructor1(String s){ this.str1 = s; } public static void main(String[] args) { Constructor1 c = ne

makai5521的博客 368

java期末期末考试卷,JAVA期末考试卷.doc

JAVA期末考试卷.doc (1) 下列有关构造函数描述正确的是( C ) 。A、所有类都必须定义一个构造函数B、构造函数必须有返回值C、构造函数必须访问类的非静态成员D、构造函数可以初始化类的成员变量(2) 编译运行下面代码时显示的结果是( A ) 。public class ThisConstructorCall {public ThisConstructorCall(String s) {...

weixin_33722350的博客 245

[JAVA编程思想]chap2一切都是对象

2.1 用句柄操纵对象 handle 2.2 所有对象都必须创建 2.2.1 保存到什么地方 寄存器。堆栈。堆。静态存储。常数存储。非RAM存储。 2.2.2 特殊情况:主要类型 2.2.3 Java数组 2.3 绝对不要清除对象 2.3.1 作用域 作为在作用域里定义的一个变量,它只有在那个作用域结束之前才可使用。 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段方法 2...

weixin_39656383的博客 168

JAVA_chap03

第三章: Expressions and Flow Control(63-83)        程序的基本功能是处理数据        程序用变量来表示数据;       程序中必须先定义变量才能使用;    定义变量是指设定变量的数据类型变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则。变量的使用有一个作用域的问题,作用域是指它的存在范围,只有在这个范围内程序代码才能访问它...

janggeumkk的博客 372

Java之学习笔记(16)------------构造器、方法重载

当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null.       构造器可以改变这种默认的初始化。       构造器的作用:是创建java对象的重要途径,是不是说构造器完全负责创建java对象?????                                 答:是创建java对象的

huohu1007的博客 495

热点块问题中pctfree的设置

一段时间前做了一个STATSPACK,发现cache buffers chains等待较多,通过对x$bh的查询找到热点对象。(ORACLE9208) SQL> select owner,object_name from...

congshugu0910的博客 202

创建Dog类

学习如何编写Python的类 编写类时,可定义一大类对象都有的通用行为。 基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。 根据类来创建对象称为实例化。 (一)创建使用类 创建Dog类 我们先看示例然后详细解读它: class Dog: '''一次模拟小狗的简单尝试''' def __init__(self,name,age): #TypeError: Dog() takes no arguments '''初始化nameage''

hfding 4973

Thinking in Java 第四版完整版 第五章练习题 初始化与清理

Thinking in Java 第四版完整版 第五章练习题,记录一下(jdk1.8.0) 1. /** * 练习1:创建一个类,它包含一个未初始化的String引用。验证该引用被Java初始化成了null。 * @author admin11 * @date 2018年32日 */ public class Exercise501 { String str;...

summerSunStart的博客 1054

第五章:初始化与清理

第五章 初始化与清理 初始化清理正是涉及安全的两个问题,Java中也引入了构造器,额外提供了垃圾回收器 5.1 用构造器确保初始化 构造方法会在new对象的时候,也就是我们调用对象之前去执行一些初始化的操作 那么我们也可以在构造方法中去传参 如果某一种构造器是类中唯一的构造器,编译器不会允许你以其他任何方式创建该对象 练习1、创建一个类,初始化String为null pub...

pengbo6665631的博客 579

Java中重载重写的区别

重载overloading 1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。 2Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数不同的定义。调用方法时通过传递给它们的不同参数个数参数类型给它们的不同参数个数参数类型给它们的不同参数个数参数类型来决定具体使用

永不放弃 12万+

政府科技管理部门如何实现科技成果高效转化?.docx

政府科技管理部门如何实现科技成果高效转化?

国有企业如何推动科技创新与产业升级融合?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

上一篇: [JAVA编程思想]chap3控制流程程序
下一篇: [JAVA编程思想]chap5隐藏实施过程
weixin_39656383
博客等级 码龄9年 2粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值