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