1 Java 中创建对象的两种方式
你提出了一个很好的问题!在 Java 中,创建对象确实有两种常见的方式:
-
带引用变量的方式:创建对象并将其赋值给一个引用变量
java
Person person = new Person();
-
不带引用变量的方式:直接创建对象但不保留引用
java
new Person();
这两种方式在语法上都是正确的,区别在于:
带引用变量:你可以在后续代码中使用这个变量来访问对象的属性和方法
不带引用变量:创建的对象只能在当前语句中使用,之后如果没有其他引用指向它,就会成为垃圾回收的候选对象
为什么代码中使用 new Child()
?
在你提供的代码中,new Child()
是在 test
类的构造函数中使用的,这种写法有以下几种可能的原因:
- 临时对象:
Child
对象只需要在构造过程中存在,不需要在test
对象的生命周期内保留引用 - 副作用目的:创建
Child
对象的主要目的是触发其构造函数或初始化块中的某些操作,而不是为了后续使用 - 一次性操作:
Child
对象的作用仅限于构造过程,之后不再需要
完整示例
下面是一个包含 Child
类定义的完整示例,展示了代码的执行流程:
java
public class test {
{
System.out.println("类test的实例初始化块");
}
static {
System.out.println("类test的静态初始化块");
}
public test() {
System.out.println("test类的构造函数 - 创建Child对象");
new Child();
}
public static void main(String[] args) {
System.out.println("main方法开始");
new test();
}
}
class Child {
{
System.out.println("Child类的实例初始化块");
}
static {
System.out.println("Child类的静态初始化块");
}
public Child() {
System.out.println("Child类的构造函数");
}
}
运行这段代码,你会看到初始化块和构造函数按照它们的执行顺序输出信息。即使 Child
对象没有被赋值给引用变量,它的构造过程仍然会正常执行。
2 final方法不能被重写,不会被覆盖,但是可以重载
成员方法被标记为final成为终极方法(final method),被标记final的方法将不能被重写
安全考虑。这样调用final类型的方法时可以确保被调用的是正确的、原始的方法
标记为final有时也被用于优化
类的私有方法不能被覆盖,因此,系统将它当作final方法处理。如果尝试在子类中覆盖它,实际上定义的是一个新的方法,与原来的私有方法没有任何关系。(私有方法是final的)
可以使用关键字final明确修饰某个私有方法,不过,这并没有什么实际意义。
关闭重写的举措:
1、禁止派生子类:将账户类设为final ;
2、禁止子类重写取款操作:将取款操作设为final 或 static。
小结~~~~~~~~~~~~
1 被定义成final的类不能有子类。
例: final class Employee { }
class Manager extends Employee{ …} 大错特错×!!!
2 被定义成final 的成员方法不能被重写。
3 被定义成final的成员变量不能改变。该变量实际上是常量,一般大写,并赋值。
final int NUMBER = 100;
3 抽象类也可以有普通的成员变量和方法
一个类如果只声明方法而没有方法的实现,则称为抽象类。
必须在声明中增加 abstract 关键字,在无方法体的方法前也要加上abstract。
public abstract class Drawing{
public abstract void drawDot( int x, int y);
public void drawLine(int x1, int y1, int x2,int y2) {... // 调用drawDot()方法 } }
抽象类也可有普通的成员变量或方法。
4 switch语句穿透性
重点:
- switch语句如果case中没有break,会发生case穿透
- 执行会从匹配的case开始,一直执行到遇到break或结束
- default子句如果存在,在穿透时也会被执行
5 按位或
Java 中的位运算符 |
(按位或)
在 Java 中,|
是一个位运算符,表示按位或(Bitwise OR)操作。这个运算符会对两个操作数的每一个对应位进行逻辑或运算。
按位或的基本规则
按位或运算的规则是:对于每一对对应位,如果其中一个或两个都是 1,则结果位为 1;只有当两个位都是 0 时,结果位才为 0。
plaintext
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
示例
假设我们有两个整数 a = 5
和 b = 3
,它们的二进制表示分别是:
plaintext
a = 5 → 0101 (二进制)
b = 3 → 0011 (二进制)
执行按位或操作 a | b
的结果是:
plaintext
0101
| 0011
------
0111 → 7 (十进制)
代码示例
下面是一个简单的 Java 程序,演示了按位或运算符的使用:
java
public class BitwiseOrExample {
public static void main(String[] args) {
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a | b; // 二进制: 0111,十进制: 7
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("a | b = " + result);
// 二进制表示
System.out.println("a 的二进制: " + Integer.toBinaryString(a));
System.out.println("b 的二进制: " + Integer.toBinaryString(b));
System.out.println("a | b 的二进制: " + Integer.toBinaryString(result));
}
}
按位或的应用场景
按位或运算符在编程中有多种用途:
-
设置标志位:在处理标志位时,按位或可以用来将某个位置为 1,同时保持其他位不变。
-
合并掩码:在图像处理或权限管理中,按位或可以用来合并多个掩码。
-
生成组合值:在某些情况下,按位或可以用来生成包含多个选项的组合值。
与逻辑或 ||
的区别
不要混淆按位或 |
和逻辑或 ||
:
- 按位或
|
:对两个操作数的每一位进行运算,适用于整数类型 - 逻辑或
||
:对两个布尔表达式进行短路逻辑运算,适用于布尔类型
java
// 逻辑或示例
boolean x = true;
boolean y = false;
boolean result = x || y; // 结果为 true
6 按位与
Java 中的位运算符 &
(按位与)
在 Java 中,&
是一个位运算符,表示按位与(Bitwise AND)操作。这个运算符会对两个操作数的每一个对应位进行逻辑与运算。
按位与的基本规则
按位与运算的规则是:对于每一对对应位,只有当两个位都是 1 时,结果位才为 1;否则结果位为 0。
plaintext
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
示例
假设我们有两个整数 a = 5
和 b = 3
,它们的二进制表示分别是:
plaintext
a = 5 → 0101 (二进制)
b = 3 → 0011 (二进制)
执行按位与操作 a & b
的结果是:
plaintext
0101
& 0011
------
0001 → 1 (十进制)
代码示例
下面是一个简单的 Java 程序,演示了按位与运算符的使用:
java
public class BitwiseAndExample {
public static void main(String[] args) {
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result = a & b; // 二进制: 0001,十进制: 1
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("a & b = " + result);
// 二进制表示
System.out.println("a 的二进制: " + Integer.toBinaryString(a));
System.out.println("b 的二进制: " + Integer.toBinaryString(b));
System.out.println("a & b 的二进制: " + Integer.toBinaryString(result));
}
}
按位与的应用场景
按位与运算符在编程中有多种用途:
-
提取特定位:通过与掩码进行按位与运算,可以提取数字中的特定位。
-
清除特定位:将特定位与 0 进行按位与运算,可以将这些位清零。
-
检查奇偶性:一个数与 1 进行按位与运算,如果结果为 1,则该数为奇数;如果结果为 0,则该数为偶数。
java
// 检查奇偶性示例
int num = 7;
if ((num & 1) == 1) {
System.out.println(num + " 是奇数");
} else {
System.out.println(num + " 是偶数");
}
- 掩码操作:在图像处理或权限管理中,按位与可以用来应用掩码。
与逻辑与 &&
的区别
不要混淆按位与 &
和逻辑与 &&
:
- 按位与
&
:对两个操作数的每一位进行运算,适用于整数类型 - 逻辑与
&&
:对两个布尔表达式进行短路逻辑运算,适用于布尔类型
java
// 逻辑与示例
boolean x = true;
boolean y = false;
boolean result = x && y; // 结果为 false
7 Java中所有异常和错误的基类是java.lang.Throwable
而不是java.lang.Exception。
其中:
- Error和Exception都继承自Throwable
- RuntimeException是Exception的子类
8 抽象类中可以包含:
- 抽象方法
- 普通方法
- 构造方法
- 静态方法等
不是只能有抽象方法,这是抽象类的重要特性之一。
9 Java 8之后,接口中可以包含:
- 抽象方法(默认)
- default默认方法
- static静态方法
而不是仅限于抽象方法。
10 创建数组
这道题目考察了Java中创建二维数组的语法知识。ABDE都是正确的数组创建语句,它们分别代表了不同的二维数组声明和初始化方式。
让我们逐个分析各选项:
A. float f[][] = new float[6][6];
正确。这是最基本的二维数组声明和创建方式,声明一个6×6的二维数组。
B. float []f[] = new float[6][6];
正确。这种写法与A等价,只是将数组标识符[]的位置做了调整。在Java中,[]可以放在变量名前后。
C. float f[][] = new float[][6];
错误。创建数组时必须指定第一维的大小。这种写法是不允许的,因为没有指定第一维的长度。
D. float [][]f = new float[6][6];
正确。这是最规范的写法,将数组标识符都放在前面,更容易理解数组的维度。
E. float [][]f = new float[6][];
正确。这是创建不规则数组(交错数组)的写法。只指定第一维的大小,第二维的大小可以动态指定,这样每行可以有不同的列数。