java复习 10

1 Java 中创建对象的两种方式

你提出了一个很好的问题!在 Java 中,创建对象确实有两种常见的方式:

  1. 带引用变量的方式:创建对象并将其赋值给一个引用变量

    java

    Person person = new Person();
    
  2. 不带引用变量的方式:直接创建对象但不保留引用

    java

    new Person();
    

这两种方式在语法上都是正确的,区别在于:

带引用变量:你可以在后续代码中使用这个变量来访问对象的属性和方法

不带引用变量:创建的对象只能在当前语句中使用,之后如果没有其他引用指向它,就会成为垃圾回收的候选对象

为什么代码中使用 new Child()

在你提供的代码中,new Child() 是在 test 类的构造函数中使用的,这种写法有以下几种可能的原因:

  1. 临时对象:Child 对象只需要在构造过程中存在,不需要在 test 对象的生命周期内保留引用
  2. 副作用目的:创建 Child 对象的主要目的是触发其构造函数或初始化块中的某些操作,而不是为了后续使用
  3. 一次性操作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. 设置标志位:在处理标志位时,按位或可以用来将某个位置为 1,同时保持其他位不变。

  2. 合并掩码:在图像处理或权限管理中,按位或可以用来合并多个掩码。

  3. 生成组合值:在某些情况下,按位或可以用来生成包含多个选项的组合值。

与逻辑或 || 的区别

不要混淆按位或 | 和逻辑或 ||

  • 按位或 |:对两个操作数的每一位进行运算,适用于整数类型
  • 逻辑或 ||:对两个布尔表达式进行短路逻辑运算,适用于布尔类型

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));
    }
}
按位与的应用场景

按位与运算符在编程中有多种用途:

  1. 提取特定位:通过与掩码进行按位与运算,可以提取数字中的特定位。

  2. 清除特定位:将特定位与 0 进行按位与运算,可以将这些位清零。

  3. 检查奇偶性:一个数与 1 进行按位与运算,如果结果为 1,则该数为奇数;如果结果为 0,则该数为偶数。

java

// 检查奇偶性示例
int num = 7;
if ((num & 1) == 1) {
    System.out.println(num + " 是奇数");
} else {
    System.out.println(num + " 是偶数");
}
  1. 掩码操作:在图像处理或权限管理中,按位与可以用来应用掩码。
与逻辑与 && 的区别

不要混淆按位与 & 和逻辑与 &&

  • 按位与 &:对两个操作数的每一位进行运算,适用于整数类型
  • 逻辑与 &&:对两个布尔表达式进行短路逻辑运算,适用于布尔类型

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][];
正确。这是创建不规则数组(交错数组)的写法。只指定第一维的大小,第二维的大小可以动态指定,这样每行可以有不同的列数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值