动手动脑

Posted liujinxin123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手动脑相关的知识,希望对你有一定的参考价值。

1.以下代码为何无法通过编译?哪儿出错了?

package test;
public class Test {
    public static void main(String[] args)
    {
        Foo obj1=new Foo();
    }

}
class Foo
{
    int value;
    public Foo(int initValue)
    {
        value=initValue;
    }
}

             在类中的构造方法有一个参数,定义对象时没有参数,所以无法通过编译

2. 请依据代码的输出结果,自行总结Java字段初始化的规律

package init;
public class InitializeBlockDemo {

    /**
     * @param args
     */
    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字段的初始值
    //public int field=100;
    
    {
        field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
        
    }
}

实验截图:

技术分享图片

package init;
public class InitializeBlockDemo {

    /**
     * @param args
     */
    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字段的初始值
    public int field=100;
    
    {
        field=200;
    }
    //public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
        
    }
}

实验截图:

技术分享图片

       java会在初始化块和构造方法中进行初始化,当对同一变量进行多次初始化时,会按照顺序进行初始化,并保留最后一次的结果。如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

3.观察输出结果,总结出“静态初始化块的执行顺序”

技术分享图片

执行顺序:

       先执行父类的静态初始化块,在执行子类的静态初始化块,在执行父类的实例初始化块、构造方法,子类的实例初始化块、构造函数。先执行静态,在执行实例和构造方法。

4.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

package test;
public class Test {
    public static void main(String[] args)
    {
        Foo.s();
    }

}
class Foo
{
    int value1=1;
    static int value2=2;
    public static void s()
    {
        System.out.println("value1="+new Foo().value1);
        System.out.println("value2="+value2);
    }
}

实验截图:
技术分享图片

         静态方法在访问本类的成员时,只允许访问静态成员,当需要在静态方法中访问本类中的静态成员时,需定义一个该类的对象,然后在方法中通过对象名.静态成员的方法来访问。

5.两对整数明明完全一样,为何一个输出true,一个输出false?

public class StrangeIntegerBehavior 
{

    
    public static void main(String[] args)
    {

        
        Integer i1=100;
       
        Integer j1=100;
        
        System.out.println(i1==j1);

        
        Integer i2=129;
        
        Integer j2=129;
        
        System.out.println(i2==j2);
    
    }


}

i1和j1调用了integer中的cache方法,所以i1和j1指向的是同一个对象,所以为true。i2和j2创建了新的对象,指向不同,所以结果是false


以上是关于动手动脑的主要内容,如果未能解决你的问题,请参考以下文章

课堂动手动脑

Java11月9日的动手动脑

方法的动手动脑

动手动脑

第七周动手动脑(2018.10.29-11.4)

JAVA09异常处理之动手动脑问题