代码改变世界

动手动脑以及课后作业

2015-10-17 17:12  逆光而行  阅读(139)  评论(0编辑  收藏  举报

动手动脑

一.代码:

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

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

程序无法运行,原因是类本身提供了一个自定义的构造方法,从而系统不再提供默认的构造方法。

二.代码:

package show6;

public class Lei {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        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()
    {}


}

输出结果:

Java进行初始化的地方有两个:初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

三.代码:

 

package show7;

public class Jiecheng {
    public static void main(String args[])
    {
        Son s=new Son();
        s.print();
        
    }

}
//father
class Father{
    String name;
    int age;
    {
        name="liming";
        age=21;
        
    }
}
//son
class Son extends Father{
    String like="basketball";
    void print()
    {
        System.out.println("name:"+name+"/nage:"+age+"aihao:"+like);
    }
}

 

运行结果:

 

当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

四.代码:

package show8;
    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 TestStaticInitializeBlock
    {
        public static void main(String[] args) 
        {
            new Leaf();
            

        }
    }

运行结果:

首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态内容。

五.代码:

package show9;

public class Test {
    protected String alpha;    
    public void dt()
    {        
        System.out.println("abcd");    
        }    
    public static void main(String[] args) 
    {            
        Test t = new Test();                   
        t.dt();    
        }


}

运行结果:

 

在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。如果静态方法中必须要调用非静态方法,可以先new(实例),之后通过new实例化的引用调用此类的方法。

课后作业:

代码:

 

package show5;

public class Chaxun {
     private static int n;
        public  Chaxun()
        {
            n++; //每次new一个对象是n+1
        }
        public static int getNum()
        {
            return n; //返回n值
        }
        public static void main(String[] args){
             Chaxun s1=new  Chaxun();
             Chaxun s2=new  Chaxun();
             Chaxun s3=new  Chaxun(); 
             Chaxun s4=new  Chaxun();//创建对象
            System.out.println("共有对象个数为:"+ Chaxun.getNum());
        }



}

 

运行结果: