研一转码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对象被用无参构造创建之前 会先去调用父类的无参构造方法
所以父类的构造代码块和构造方法都会被执行
其次再执行自己的构造代码块和构造方法
种类 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对象被用无参构造创建之前 会先去调用父类的无参构造方法
所以父类的构造代码块和构造方法都会被执行
其次再执行自己的构造代码块和构造方法
全部评论
相关推荐