**最近学了些分布式的知识,想要找个项目做做,暂时没找到合适的,先每天练练基础,再学些新知识吧; 正好也要应付学校的Java考试

java刷题笔记1

T1 类中各种块的优先级问题

image-20231006163029876

  • 静态块:用static声明,JVM加载类时执行,仅执行一次

  • 构造块:类中直接用{}定义,每一次创建对象时执行

  • 执行顺序优先级:静态块>main()>构造块>构造方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class CodeBlock {
    static{
    System.out.println("静态代码块");
    }
    {
    System.out.println("构造代码块");
    }
    public CodeBlock(){
    System.out.println("无参构造函数");
    }

    public void sayHello(){
    {
    System.out.println("普通代码块");
    }
    }

    public static void main(String[] args) {
    System.out.println("执行了main方法");

    new CodeBlock().sayHello();;
    System.out.println("---------------");
    new CodeBlock().sayHello();;
    }
    }

思路:

开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分,也就是构造块部分(输出’’构造块’’)接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出’构造块’),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出’静态块’),接着执行,main方法,同样也,new了对象,调用构造函数输出(’构造块’) …

作者:MOBIN
链接:https://www.nowcoder.com/exam/test/74549938/submission?examPageSource=Intelligent&pid=53351303&testCallback=https%3A%2F%2Fwww.nowcoder.com%2Fexam%2Fintelligent%3FquestionJobId%3D10
来源:牛客网

总结 : 静态只会在类第一次加载时才会被初始化,在静态域中对于静态变量和静态块的初始化顺序则由它们的相对位置所决定; 静态域中包含静态变量、静态块和静态方法

T2 final & String

image-20231006163846492

对于E : final的陈元方法除了能读取类的成员变量,还能读取类变量(static修饰的静态变量)

对于F : String 不可以修改,StringBuffer 和 StringBuilder 可以修改,String 只能改变指引,如果字符串常量池中没有需要的串,就创建一 个新的字符串,然后让 String 对象指向它。

T3 数组为空时的默认初始化

image-20231006182505221

image-20231006182816176

T4 Object类方法

image-20231006194022762

Object类中存在的方法如下:

  1. getClass 2. hashCode 3. equals 4. clone 5. toString 6.notify 7. notifyAll 8. wait 9. finalize

T5 基类&派生类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//下面代码的输出结果?

public class Base
{
private String baseName = "base";
public Base()
{
callName();
}

public void callName()
{
System. out. println(baseName);
}

static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}

在new Sub()时先创建的是基类对象Base,然后才创建派生类对象Sub; 在创建Base时执行构造方法,因为派生类重写了callName()方法,所以此时调用的是派生类Sub中的callName()方法,但是此时派生类还未被构造,变量baseName的值为null;

总结: 在创造派生类的过程中首先构造基类对象, 若在实例化派生类时,基类构造函数中调用的方法被派生类重写,则调用派生类中重写后的方法 ; 需要注意的是,此时派生类中的成员变量可能仍未被创建

T6 内部类&外部类

image-20231006201504335

定义: 将一个类定义在另一个类或方法中,这个类叫做内部类,可以分为四种

  • 成员内部类
    内部类可以: private、protected、public及包访问权限。如果成员内部类用private修饰,则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。

  • 局部内部类

    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;

    局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

  • 匿名内部类

    唯一一种没有构造器的类;

    不能有访问修饰符和static修饰符的;

  • 内部静态类

    不需要依赖于外部类的,这点和类的静态成员属性有点类似

    不能使用外部类的非static成员变量或者方法。

外部类可用修饰: public、default、abstract、final

外部类如果用非公开的修饰符修饰了,那谁来调用它,如何调用它…