研一转码Java自学Day1 权限修饰符和代码块

1.权限修饰符:
种类 private 默认(default) protected public
Private:只能本类访问
Default:同一个包中的类可以访问
Protected:不同包的子类可以访问
Public:不同包中的类也可以访问
2. 代码块 构造代码块 静态代码块
代码块:
用于在内存紧张的时候 回收掉无用的局部变量 节约内存
构造代码块:
用于抽取一个类中不同的构造函数的相同行为 更为简练
静态代码块:
在类被读取入内存时 就执行代码块中的内容 常用于一些数据的提前初始化
3.代码块练习题
题目1: 请编写一个Java类,包含如下三种代码块,并在main方法中创建该类的多个对象,观察输出结果。
•静态代码块:打印“静态代码块执行”
•构造代码块:打印“构造代码块执行”
•构造方法:打印“构造方法执行”
要求:
•分析控制台输出的顺序,并解释原因。

package BlockPrac;

public class Test {
    public static void main(String[] args) {
        myBlock block = new myBlock();

    }
}

class myBlock{
    static{
        System.out.println("静态代码块执行");
    }
    private int x;
    private int y;
    {
        System.out.println("构造代码块执行");
    }
    myBlock(){
        System.out.println("构造方法执行");
    }

}
输出结果:
静态代码块执行
构造代码块执行
构造方法执行
原因:
在类被读入内存的时候 静态代码块就被执行了
在对象被创建后 构造代码块先于构造方法被执行
最后构造方法被执行

2. 静态代码块应用
题目2: 请设计一个类StaticTest,要求如下:
•类有一个静态成员变量count,用于统计创建了多少个StaticTest对象。
•在静态代码块中打印“StaticTest类被加载”。
•在构造方法中让count自增,并打印“第X个对象被创建”,其中X是当前对象编号。
•在main方法中,连续创建三个StaticTest对象。
要求:
•观察输出结果。
•解释静态代码块和构造方法的执行时机。

public class Test2 {
    public static void main(String[] args) {
        staticTest s1 = new staticTest();
        staticTest s2 = new staticTest();
        staticTest s3 = new staticTest();
    }
}
 class staticTest{
    static int count=0;
    static{
        System.out.println("staticTest类被加载");

    }

    staticTest(){
        count++;
        System.out.printf("第%d个对象被创建!",count);
    }
 }

输出结果:
staticTest类被加载
第1个对象被创建!
第2个对象被创建!
第3个对象被创建!

静态代码块在被类加载进内存时就被执行
而构造方法在对象被创建时才被执行

3. 构造代码块与继承
题目3: 请编写一个父类Parent和子类Child:
•在Parent和Child中都写一个构造代码块、一个静态代码块和一个构造方法,分别打印不同的信息(比如“Parent静态代码块”,“Parent构造代码块”,“Parent构造方法”;“Child静态代码块”,以此类推)。
•在main方法中,创建Child对象。
要求:
•画出输出顺序。
•解释为什么会按照这样的顺序执行。、

代码:
public class Test3 {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

class Parent{
    static{
        System.out.println("Parent 静态代码块");
    }
    private String name;
    {
        System.out.println("Parent构造代码块");
    }
    Parent(){
        System.out.println("Parent构造方法");
    }

}

class Child extends Parent{
    static{
        System.out.println("Child 静态代码块");
    }
    private String name;
    {
        System.out.println("Child构造代码块");
    }
    Child(){
        System.out.println("Child构造方法");
    }

}
输出结果:
Parent 静态代码块
Child 静态代码块
Parent构造代码块
Parent构造方法
Child构造代码块
Child构造方法

解释:
在Child对象创建前 其父类Parent先被加载 子类Child后被加载 
所以父类的静态代码块先被执行 其次是子类的被执行
在Child对象被用无参构造创建之前 会先去调用父类的无参构造方法
所以父类的构造代码块和构造方法都会被执行
其次再执行自己的构造代码块和构造方法
全部评论

相关推荐

昨天 14:23
福州大学 Java
点赞 评论 收藏
分享
哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务