9.21一面

问科研项目

主要是解决什么问题

>>和>>>

移位操作符只能处理整数类型。

int类型占4个字节(一共32位),第一位表示符号位,其它位为数值为。那么它最大能表示2^31-1(即2147483647),最小能表示-2^31(即-2147483648)。

为什么最小值不是-2^31-1,而是-2^31?

  • 负数在计算机中以补码表示(符号位不变,原码取反再加1),因此10000000 00000000 00000000 00000000表示最大的负数,为-2^31。
1
2
3
4
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Integer.toBinaryString(-2147483648)); //10000000000000000000000000000000
System.out.println(Integer.toBinaryString(-1)); // 11111111111111111111111111111111

移位操作符有以下几种(注意:移位时符号位也会跟着移动):

  • 左移位操作符<<,低位补0
  • 有符号右移位>>,使用符号扩展:若符号为正,则在高位插入0;若符号为负,则在高位插入1
  • 无符号右移位>>>,使用零扩展:无论正负,都在高位插入0

如果对char、byte、short类型移位,则在移位前,它们会被转成int类型,且返回值也是int类型;如果对long类型移位,则返回值也是long。

finally和finalize

(1)finally:搭配try-catch一起使用,正常情况下,不管是否抛出异常或者捕获异常,finally都会执行。

什么是否finally不执行:在try中调用System.exit(1)或者halt函数时不执行,

以下两种情况要清楚:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.company;

public class Main {
static String test(){
try {
System.out.println("123");
throw new Exception(); //未处理异常
} finally {
System.out.println("finally");
}

}
public static void main(String[] args) {
// write your code her
System.out.println(test());
}
}

上面代码抛出异常。

但finally语句return后就不会抛出异常了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
static String test(){
try {
System.out.println("123");
throw new Exception();
} finally {
return "finally";
}

}
public static void main(String[] args) {
// write your code her
System.out.println(test());
}
}

程序正常,输出:

1
2
123
finally

覆盖其他返回语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
static String test(){
try {
System.out.println("123");
return "try"; //被覆盖
} finally {
return "finally";
}

}
public static void main(String[] args) {
// write your code her
System.out.println(test());
}
}

结果为:

1
2
3
123
finally

改变throw或return行为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
static String test(){
try {
System.out.println("123");
return "try";
} finally {
throw new Exception();
}

}
public static void main(String[] args) {
// write your code her
System.out.println(test());
}
}

结果为:

try代码中没有异常,可以正常返回,。但在fianlly中抛出异常

(2)finalize

是Object类提供的方法,Java中的垃圾回收机制在回收对象的时候,会首先调用该对象的finalize方法,

1
protected void finalize() throws Throwable { }

具体使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class FinalizeDemo01 {
public static void main(String[] args) {
for (int j = 0; j < 100000; j++) {
Person person = new Person();
person=null;
/**
* 增大概率*/
System.gc();
}
}
}
class Person{
/**
* 有概率回收。
* 垃圾回收前自动调用此方法。*/
@Override
protected void finalize(){
System.out.println("对象即将被销毁");
}
}

输出:”

1
2
3
4
5
6
7
8
9
对象被销毁
对象被销毁
对象被销毁
对象被销毁
对象被销毁
对象被销毁
对象被销毁
对象被销毁
。。。。。。

内部类的作用和声明方式

内部类作用:内部类使得多继承的解决方案变得更加完整(也就是内部类可以实现多继承),每个内部类都能独立继承一个实现,所以无论外围类是否已经继承了某个实现,对于内部类都没有影响。

内部类的特性:

  • 内部类的对象与外围对象相互独立
  • 多个内部类可以以不同的方式实现同一个接口或继承同一个类
  • 内部类提供了更好的封装,除了外围类,其他类不能访问,。

内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类

(1)成员内部类

让内部类可以访问外部类中定义的一个私有的msg属性的内容。内部类有一个最大的优点:可以访问外部类中的私有操作。
内部类可以访问外部类的私有属性,反之,外部类可以通过内部类对象访问内部类的私有属性

注意:

  • 成员内部类不能有任何static的变量和方法
  • 成员内部类是依附于外围类的,所以只有 先创建外围类才能创建内部类

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Outer{
private String msg = "hello world";
class Inner{//定义了一个内部类
public void print(){
// 外部类.this = 外部类的当前对象
System.out.println(Outer.this.msg);
}
}
public void fun(){
new Inner().print();
}
}
public class TestDemo{
public static void main(String args[]){
Outer out = new Outer();//实例化外部类
out.fun();//调用外部类
}
}

实例化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 class Outer{
private String msg="hello world";
class Inner{//定义了一个内部类
public void print(){
System.out.println(Outer.this.msg);
}
}
}
public class TestDemo{
public static void main(String args[]){
Outer.Inner oi = new Outer().new Inner();
oi.print();
}
}

如果内部类定义为private,则内部类不能在外部进行对象的实例化。

(2)静态内部类

使用static定义的属性或者方法是不受类实例化对象控制的,所以使用了static定义内部类。不受外部类实例化对象的控制。
如果一个内部类使用了static定义的话,那么这个内部类就变为了一个外部类,并且只能访问static定义的操作。相当于定义一个外部类。

注意:

  • 它的创建是不需要依赖于外部类
  • 它不能使用任何外部类的非static成员变量和方法

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Outer{
private static String msg="Hello World";
static class Inner{
public void print(){
System.out.println(msg);
}
}
}
public class TestDemo{
public static void main(String args[]){
Outer.Inner oi = new Outer.Inner();//此时不需要先产生外部类对象,再产生内部类对象,仿佛一个独立的类。
oi.print();
}
}

(3)局部内部类

它是嵌套在方法和作用于内的,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Outer{
private String msg = "Hello World";
public void fun(int num){//方法参数
double score = 99.9;//方法变量
class Inner{
public void print(){
System.out.println("属性" + Outer.this.msg);
System.out.println("方法参数:" + num);
System.out.println("方法变量:" + score);
}
}
new Inner().print();
}
}
public class TestDemo{
public static void main(String args[]){
new Outer().fun(100);
}
}

(4)匿名内部类

匿名内部类是没有访问修饰符的,没有构造方法的。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TestDemo{
public static void main(String args[]) throws Exception{
fun(new IMessage(){
public void print(){
System.out.println("匿名内部类");
}
});
}
public static void fun(IMessage msg){
msg.print();
}
}

是否了解设计模式

redis持久化

@Autowired作用

还有一些不记得了~~


9.21一面
http://example.com/2022/09/21/9-21一面/
作者
zlw
发布于
2022年9月21日
许可协议