JAVA代碼案例6.11
創(chuàng)建一個(gè)抽象類Number,包含一個(gè)抽象方法display(),然后創(chuàng)建兩個(gè)子類Integer和Double,分別實(shí)現(xiàn)display()方法來打印整數(shù)和浮點(diǎn)數(shù)。
以下是一個(gè)示例的Java程序,定義了抽象類 `Number`,并從 `Number` 類派生出兩個(gè)子類 `Integer` 和 `Double`,分別實(shí)現(xiàn)了 `display()` 方法來打印整數(shù)和浮點(diǎn)數(shù):
```java
abstract class Number {
? ? abstract void display();
}
class IntegerNumber extends Number {
? ? private int value;
? ? public IntegerNumber(int value) {
? ? ? ? this.value = value;
? ? }
? ? @Override
? ? void display() {
? ? ? ? System.out.println("Integer Number: " + value);
? ? }
}
class DoubleNumber extends Number {
? ? private double value;
? ? public DoubleNumber(double value) {
? ? ? ? this.value = value;
? ? }
? ? @Override
? ? void display() {
? ? ? ? System.out.println("Double Number: " + value);
? ? }
}
public class Main {
? ? public static void main(String[] args) {
? ? ? ? IntegerNumber integerNumber = new IntegerNumber(10);
? ? ? ? integerNumber.display();
? ? ? ? DoubleNumber doubleNumber = new DoubleNumber(3.14);
? ? ? ? doubleNumber.display();
? ? }
}
```
在上述程序中,`Number` 是一個(gè)抽象類,包含了一個(gè)抽象方法 `display()`。`IntegerNumber` 類和 `DoubleNumber` 類都繼承自 `Number` 類,并實(shí)現(xiàn)了各自的 `display()` 方法來打印整數(shù)和浮點(diǎn)數(shù)。
在 `Main` 類中,創(chuàng)建了一個(gè) `IntegerNumber` 對(duì)象 `integerNumber`,并調(diào)用其 `display()` 方法來打印整數(shù)。然后,創(chuàng)建了一個(gè) `DoubleNumber` 對(duì)象 `doubleNumber`,并調(diào)用其 `display()` 方法來打印浮點(diǎn)數(shù)。
運(yùn)行這個(gè)程序?qū)⑤敵鲆韵陆Y(jié)果:
```
Integer Number: 10
Double Number: 3.14
```
這些結(jié)果是根據(jù)對(duì)象的類型和屬性值打印得到的。
創(chuàng)建一個(gè)日期格式化工具類DateFormatter,包含一個(gè)靜態(tài)方法formatDate(),接受一個(gè)LocalDateTime對(duì)象和一個(gè)格式字符串作為參數(shù),并返回格式化后的日期字符串。
以下是一個(gè)示例的Java程序,定義了一個(gè)日期格式化工具類 `DateFormatter`,其中包含一個(gè)靜態(tài)方法 `formatDate()`,用于接受一個(gè) `LocalDateTime` 對(duì)象和一個(gè)格式字符串作為參數(shù),并返回格式化后的日期字符串:
```java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatter {
? ? public static String formatDate(LocalDateTime dateTime, String format) {
? ? ? ? DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
? ? ? ? return dateTime.format(formatter);
? ? }
? ? public static void main(String[] args) {
? ? ? ? LocalDateTime now = LocalDateTime.now();
? ? ? ? String formattedDate = DateFormatter.formatDate(now, "yyyy-MM-dd HH:mm:ss");
? ? ? ? System.out.println("Formatted Date: " + formattedDate);
? ? }
}
```
在上述程序中,`DateFormatter` 類包含了一個(gè)靜態(tài)方法 `formatDate()`。該方法接受一個(gè) `LocalDateTime` 對(duì)象和一個(gè)格式字符串作為參數(shù),并使用 `DateTimeFormatter` 類來進(jìn)行日期格式化操作。最后,返回格式化后的日期字符串。
在 `main` 方法中,我們使用 `LocalDateTime.now()` 獲取當(dāng)前日期和時(shí)間。然后,調(diào)用 `DateFormatter.formatDate()` 方法,將當(dāng)前日期和時(shí)間對(duì)象以及所需的日期格式字符串作為參數(shù)傳遞。最后,將格式化后的日期字符串打印到控制臺(tái)。
運(yùn)行這個(gè)程序?qū)⑤敵鲱愃埔韵陆Y(jié)果:
```
Formatted Date: 2023-06-11 15:30:45
```
這個(gè)結(jié)果是根據(jù)當(dāng)前的日期和時(shí)間以及給定的日期格式字符串進(jìn)行格式化得到的。請(qǐng)注意,實(shí)際的日期和時(shí)間將根據(jù)運(yùn)行程序的時(shí)間而有所不同。
創(chuàng)建一個(gè)類StringUtils,包含一個(gè)靜態(tài)方法reverseWords(),接受一個(gè)字符串作為參數(shù),然后將其中的單詞進(jìn)行反轉(zhuǎn),并返回結(jié)果。
以下是一個(gè)示例的Java程序,定義了一個(gè)字符串工具類 `StringUtils`,其中包含一個(gè)靜態(tài)方法 `reverseWords()`,用于接受一個(gè)字符串作為參數(shù),并將其中的單詞進(jìn)行反轉(zhuǎn),并返回結(jié)果:
```java
public class StringUtils {
? ? public static String reverseWords(String input) {
? ? ? ? if (input == null || input.isEmpty()) {
? ? ? ? ? ? return input;
? ? ? ? }
? ? ? ? String[] words = input.split(" ");
? ? ? ? StringBuilder reversed = new StringBuilder();
? ? ? ? for (int i = words.length - 1; i >= 0; i--) {
? ? ? ? ? ? reversed.append(words[i]);
? ? ? ? ? ? if (i > 0) {
? ? ? ? ? ? ? ? reversed.append(" ");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return reversed.toString();
? ? }
? ? public static void main(String[] args) {
? ? ? ? String input = "Hello World! Welcome to Java";
? ? ? ? String reversedWords = StringUtils.reverseWords(input);
? ? ? ? System.out.println("Reversed Words: " + reversedWords);
? ? }
}
```
在上述程序中,`StringUtils` 類包含了一個(gè)靜態(tài)方法 `reverseWords()`。該方法接受一個(gè)字符串作為參數(shù),并通過使用空格進(jìn)行分割,將其中的單詞存儲(chǔ)在一個(gè)字符串?dāng)?shù)組中。然后,使用一個(gè)循環(huán)從后往前遍歷單詞數(shù)組,并將每個(gè)單詞追加到一個(gè) `StringBuilder` 對(duì)象中,同時(shí)在單詞之間添加空格。最后,將 `StringBuilder` 對(duì)象轉(zhuǎn)換為字符串并返回。
在 `main` 方法中,我們定義了一個(gè)輸入字符串 `input`,并調(diào)用 `StringUtils.reverseWords()` 方法來反轉(zhuǎn)其中的單詞。然后,將反轉(zhuǎn)后的結(jié)果打印到控制臺(tái)。
運(yùn)行這個(gè)程序?qū)⑤敵鲱愃埔韵陆Y(jié)果:
```
Reversed Words: Java to Welcome World! Hello
```
這個(gè)結(jié)果是根據(jù)給定的輸入字符串中的單詞進(jìn)行反轉(zhuǎn)得到的。
創(chuàng)建一個(gè)類MathUtil,包含靜態(tài)方法getMax()和getMin(),分別接受兩個(gè)整數(shù)參數(shù),并返回它們的最大值和最小值。
以下是一個(gè)示例的Java程序,定義了類 `MathUtil`,其中包含靜態(tài)方法 `getMax()` 和 `getMin()`,用于獲取兩個(gè)整數(shù)參數(shù)的最大值和最小值:
```java
public class MathUtil {
? ? public static int getMax(int num1, int num2) {
? ? ? ? return Math.max(num1, num2);
? ? }
? ? public static int getMin(int num1, int num2) {
? ? ? ? return Math.min(num1, num2);
? ? }
? ? public static void main(String[] args) {
? ? ? ? int a = 10;
? ? ? ? int b = 5;
? ? ? ? int max = MathUtil.getMax(a, b);
? ? ? ? int min = MathUtil.getMin(a, b);
? ? ? ? System.out.println("Max: " + max);
? ? ? ? System.out.println("Min: " + min);
? ? }
}
```
在上述程序中,`MathUtil` 類包含了靜態(tài)方法 `getMax()` 和 `getMin()`。這些方法使用了Java的 `Math` 類中提供的 `max()` 和 `min()` 方法來計(jì)算兩個(gè)整數(shù)的最大值和最小值。
在 `main` 方法中,我們定義了兩個(gè)整數(shù)變量 `a` 和 `b`,并使用 `MathUtil` 類的靜態(tài)方法 `getMax()` 和 `getMin()` 來獲取它們的最大值和最小值。然后,我們將這些值打印到控制臺(tái)。
運(yùn)行這個(gè)程序?qū)⑤敵鲆韵陆Y(jié)果:
```
Max: 10
Min: 5
```
這些結(jié)果是根據(jù)給定的整數(shù)變量 `a` 和 `b` 計(jì)算得出的最大值和最小值。
編寫一個(gè)程序,演示Java的垃圾回收機(jī)制,創(chuàng)建多個(gè)對(duì)象并在適當(dāng)?shù)臅r(shí)候?qū)⑵湓O(shè)置為null,然后手動(dòng)調(diào)用垃圾回收。
在Java中,垃圾回收是由Java虛擬機(jī)(JVM)自動(dòng)處理的,開發(fā)人員無法精確控制垃圾回收的具體時(shí)機(jī)。但是,我們可以通過將對(duì)象設(shè)置為null來提示JVM可以回收它們。雖然手動(dòng)調(diào)用垃圾回收不是必需的,但可以通過調(diào)用`System.gc()`方法來請(qǐng)求JVM運(yùn)行垃圾回收。
下面是一個(gè)示例程序,演示了創(chuàng)建多個(gè)對(duì)象,并在適當(dāng)?shù)臅r(shí)候?qū)⑵湓O(shè)置為null,然后手動(dòng)調(diào)用垃圾回收:
```java
public class GarbageCollectionDemo {
? ? public static void main(String[] args) {
? ? ? ? // 創(chuàng)建多個(gè)對(duì)象
? ? ? ? Object obj1 = new Object();
? ? ? ? Object obj2 = new Object();
? ? ? ? Object obj3 = new Object();
? ? ? ? // 打印對(duì)象的哈希碼
? ? ? ? System.out.println("Object 1: " + obj1);
? ? ? ? System.out.println("Object 2: " + obj2);
? ? ? ? System.out.println("Object 3: " + obj3);
? ? ? ? // 將對(duì)象設(shè)置為null
? ? ? ? obj1 = null;
? ? ? ? obj2 = null;
? ? ? ? // 手動(dòng)調(diào)用垃圾回收
? ? ? ? System.gc();
? ? ? ? // 等待一段時(shí)間以便垃圾回收完成
? ? ? ? try {
? ? ? ? ? ? Thread.sleep(1000);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? // 打印對(duì)象的哈希碼,如果對(duì)象被成功回收,則輸出為null
? ? ? ? System.out.println("Object 1 after garbage collection: " + obj1);
? ? ? ? System.out.println("Object 2 after garbage collection: " + obj2);
? ? ? ? System.out.println("Object 3: " + obj3);
? ? }
}
```
在上述程序中,創(chuàng)建了三個(gè)對(duì)象 `obj1`、`obj2` 和 `obj3`。然后,通過打印對(duì)象的哈希碼來驗(yàn)證對(duì)象的存在。
接下來,將 `obj1` 和 `obj2` 設(shè)置為null,表示不再引用這些對(duì)象。然后,通過調(diào)用 `System.gc()` 來請(qǐng)求JVM運(yùn)行垃圾回收。注意,實(shí)際的垃圾回收時(shí)機(jī)是由JVM決定的,因此調(diào)用 `System.gc()` 并不能保證立即回收對(duì)象。
為了確保有足夠的時(shí)間進(jìn)行垃圾回收,我們使用 `Thread.sleep()` 方法讓程序等待1秒鐘。然后,再次打印對(duì)象的哈希碼。如果對(duì)象被成功回收,則輸出為null,否則仍然顯示對(duì)象的哈希碼。
運(yùn)行這個(gè)程序可能會(huì)得到以下結(jié)果:
```
Object 1: java.lang.Object@3cd1a2f1
Object 2: java.lang.Object@2f0e140b
Object 3: java.lang.Object@7440e464
Object 1 after garbage collection: null
Object 2 after garbage collection: null
Object 3: java.lang.Object@7440e464
```
注意,由于垃圾回收的具體時(shí)機(jī)是由JVM控制的,因此
輸出結(jié)果可能因JVM的不同實(shí)現(xiàn)而有所不同。