本文共 6559 字,大约阅读时间需要 21 分钟。
构造函数重载:
默认构造函数:
显式地域的初始化:
class A{ public String name = "";}
class A{ static String assignName(){ String name = ""; return name; } public String name = assignName();}
构造函数中调用其他的构造函数:
class A{ A(String name){ ... ... } A(String name1, String name2){ // call constructor A(String name) this(name1); ... ... }}
初始化块:
class A{ A(String name){ ... ... } int id; // object initialization block { id = 1; }}static域的初始化:
class A{ static int id = 1;}
class A{ static int id; static{ Random generator = new Random(); id = generator.nextInt(1000); }}
静态变量、静态初始化块、变量、初始化块、构造函数的初始化顺序:
(静态变量、静态初始化块)> (变量、初始化块)> 构造函数
测试(继承关系的类的初始化顺序):
import java.util.*;class Parent{ public String pField = "Parent - object initialization"; public static String psField = "Parent - static object initialization"; { System.out.println(pField); System.out.println("Parent - object initialization block"); } static{ System.out.println(psField); System.out.println("Parent - static object initialization block"); } public Parent(){ System.out.println("Parent - default constructor"); } public Parent(String str){ System.out.println("Parent - constructor"); }}class Child extends Parent{ public String cField = "Child - object initialization"; public static String csField = "Child - static object initialization"; { System.out.println(cField); System.out.println("Child - object initialization block"); } static{ System.out.println(csField); System.out.println("Child - static object initialization block"); } public Child(String str){ //super(str); if add this sentence, will call the constructor Parent(String str), not call default constructor. System.out.println("Child - constructor"); }}public class ObjectInitialzationTest{ public static void main(String[] args){ Parent p = new Child("Test"); }}输出:
静态变量与静态初始化块之间,变量与初始化块之间的初始化顺序是如何的呢?
测试:
import java.util.*;class A{ public A(){ System.out.println("A - constructor"); }}class B { public B(){ System.out.println("B - constructor"); }}public class ObjectInitialzationTest{ static A a = new A(); static{ System.out.println("static object initialization block"); } static B b = new B(); public static void main(String[] args){ new ObjectInitialzationTest(); }}输出:
静态变量与静态初始化块之间(变量与初始化块之间)的初始化顺序取决于它们在类中的定义顺序。
静态块与静态成员的初始化工作与实例化过程无关。实例化之前需要初始化静态块和静态成员,但并不代表实例化一定会执行静态块和静态成员。有时候执行静态块或静态成员初始化不一定就是实例化对象时才进行的,例如调研该类的某静态成员或静态方法,又例如该类的子类被实例化或者调用了静态成员或静态方法等。
实例化的顺序是(不考虑静态成员/块):
Java不支持析构函数。
(可以为类添加一个finalize方法,finalize方法将在垃圾回收器清除对象之前被调用。实际应用中,尽量不要使用。)
静态域:
class A{ private static final double PI = 3.1415926;}静态方法(同C++):
final实例域必须被初始化:
final修饰符大都用于基本类型或不可变的类:
final class Person{ ... ...}
例如:java.lang.String
public final class Stringextends Objectimplements Serializable, Comparable, CharSequence
abstract class Person{ ... ... public abstract String getDescription(); }
接口不是类,是一组对类的需求描述;
内部类时定义在另一个类中的类。
(编译器会把内部类翻译成用$分隔外部类名与内部类名的常规类文件:TalkingClock$TimePrinter.class)
class TalkingClock{ public TalkingClock(){ } public void start(){ ActionListener listener = new TimePrinter(); ...... } private int interval; private boolean beep; private class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){ // data member in TalkingClock if (beep){ ... ... } } }}
public void actionPerformed(ActionEvent event){ // data member in TalkingClock if (TalkingClock.this.beep){ ... ... } }
public void start(){ ActionListener listener = this.new TimePrinter(); ...... }
TalkingClock jabberer = new TalkingClock();TalkingClock.TimePrinter listener = jabberer.new TimePrinter();
定义一个块中类;
class TalkingClock{ public TalkingClock(){ } public void start(){ class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){ ..... if (beep){ ...... } } } ActionListener listener = new TimePrinter(); ...... } private int interval; private boolean beep;}
class TalkingClock{ public TalkingClock(){ } public void start(final boolean beep){ class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){ ..... if (beep){ ...... } } } ActionListener listener = new TimePrinter(); ...... }}
假如只创建这个类的一个对象,就不必为它命名了,这种类成为匿名内部类;
class TalkingClock{ public TalkingClock(){ } public void start(final boolean beep){ ActionListener listener = new ActionListener(){ public void actionPerformed(ActionEvent event){ ..... if (beep){ ...... } } }; ...... }}
有时候,使用内部类仅仅是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类对象,为此,可以将内部类声明为static,以便取消产生的引用;
(声明在接口中内部类自动成为static和public)
class ArrayAlg{ public static class Pari{ ... ... }}