02-类与对象动手与动脑

一:运行一下代码为何无法通过编译器,说明错误的原因

package reserve;

import javax.swing.text.StyledEditorKit.ForegroundAction;

public class Main{
    public static void main(String[] args) {
        Foo obj1=new Foo();
    }
}
class Foo{
    int value;
    public Foo(int initValue) {
    value=initValue;
   }
}

结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

二:运行下面的代码,根据输出结果,自行总结Java字段初始化的规律

package reserve;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Main {
    public static void main(String[] args) {
        InitializeBlockClass obj=new InitializeBlockClass();
        System.out.println(obj.field);
        
        obj=new InitializeBlockClass(300);
        System.out.println(obj.field);
    }
}
class InitializeBlockClass{
    {
    field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value) {
        this.field=value;
    }
    public InitializeBlockClass() {
    }
}

测试截图:

 类字段的初始化顺序:

1.执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。执行类的构造函数。

2.类的初始化块不接受任何的参数,而且只要一创建类的对象,他们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

三:运行一下代码,总结出“静态初始化块的执行顺序”

package reserve;
class Root
{
    static{
        System.out.println("Root的静态初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    public Root()
    {
        System.out.println("Root的无参数的构造器");
    }
}
class Mid extends Root
{
    static{
        System.out.println("Mid的静态初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid()
    {
        System.out.println("Mid的无参数的构造器");
    }
    public Mid(String msg)
    {
        //通过this调用同一类中重载的构造器
        this();
        System.out.println("Mid的带参数构造器,其参数值:" + msg);
    }
}
class Leaf extends Mid
{
    static{
        System.out.println("Leaf的静态初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }    
    public Leaf()
    {
        //通过super调用父类中有一个字符串参数的构造器
        super("Java初始化顺序演示");
        System.out.println("执行Leaf的构造器");
    }

}

public class Main
{
    public static void main(String[] args) 
    {
        new Leaf();
        

    }
}

测试截图:

静态初始化块的执行顺序:

1.

执行顺序:静态初始化块->初始化块->构造函数

静态初始化块:在第一次加载类时执行,与对象的创建无关。

构造代码块:在调用构造方法时执行。

构造函数:在调用构造函数时执行。

2.静态初始化块只执行一次

3.创建子类型的对象时,也会导致父类型的静态初始化块的执行

四:静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法),编写代码,验证自己的想法

package reserve;
public class Main{
    int a=1;//类的实例变量,初始化值为1
    static int b=2;//类的静态变量,初始化值为2
    public static void Method() //静态方法
    {
     System.out.println("实例变量a="+new Main().a);//在静态方法中访问类的实例变量需要首先进行类的实例化
     System.out.println("静态变量b="+b);//在类的方法中可以直接访问类的静态变量
    }
    public static void main(String[] args) {
        Main.Method();
        Main c=new Main();
        System.out.println("a="+c.a);
    }
}

测试截图:

猜你喜欢

转载自www.cnblogs.com/hhjing/p/11689393.html