动手动脑3

  类构造函数:一般再不写构造函数时系统会自动生成一个构造函数,但是一旦有了构造函数,系统将不会自动生成构造函数,并且只有自己书写的构造函输。例如:你书写了一个有参数的构造函数,那么系统只会选择这个有参数的构造函数,在类实例化时,只能调用这个方法。下面这个代码会报错,就是这个原因。

  

public class Text{

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

  关于类初始化块和定义时的初始值要看哪一个在前面,他会按顺序来进行执行,其中的值则会是最后一个进行赋值。但是有构造函数的级别是最高的。其中的结果是构造函数赋值的

package lianxi;

import java.util.Scanner;

public class Text{

    public static void main(String[] args) {
        Foo obj1=new Foo();
        System.out.println(obj1.filed);
        Foo obj2=new Foo(300);
        System.out.println(obj2.filed);
    }
}
class Foo{
    
    public int filed=100;
    {
        filed=200;
    }
    public Foo(int vaulte) {
        filed=vaulte;
    }
    public Foo() {}
}

  类的初始化块是先将静态的初始化块全部执行完,再执行父类的普通初始化块在进行父类的构造函数,在进行子类的普通初始化块和子类的构造方法。

package lianxi;

public class App7 {
    public static void main(String[] args) 
    {
        new Leaf();
    }
}
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 App7 {
    public static void main(String[] args) 
    {
        Root r=new Root();
        System.out.println(new Root().str);
        new Root().function();
        System.out.println(new Root().str="改变的成员变量");
        System.out.println(r.str);
        new App7().fun();
    }
    public void fun() {
        System.out.println("本类中的非静态方法");
    }
}
class Root
{
    public String str="成员变量";
    public void function(){
        System.out.println("成员方法");
    }
}

 

 

  

posted @ 2018-10-21 16:10  九离  阅读(165)  评论(0编辑  收藏  举报