一、对象的创建过程

  1. 分配空间
  2. 初始化 属性,若有赋值操作,则进行赋值
  3. 加载代码块
  4. 对未赋值的属性,进行赋值(默认值)
  5. 将类中的所有 成员方法,加入到 内存中
  6. 调用构造方法,完成对象的创建
public class ObjectTest {
    {
        a = 30;
        System.out.println("这是代码块");
    }
    private int a = 10;
    ObjectTest(){
        a = 20;
        System.out.println("这是无参构造");
    }

    public static void main(String[] args) {
        ObjectTest oj = new ObjectTest();
        System.out.println(oj.a);
        // 每次创建一个对象,都会发生一次 对象的创建的过程
        ObjectTest oj2 = new ObjectTest();
        System.out.println(oj2.a);
    }
}

二、内部类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名类

成员内部类

  1. private 修饰内部类(私有化)
// 银行类
public class Bank {
    /**
     * 银行柜台取钱方法
     * 早些年刚刚诞生ATM还未普及测试阶段,假设去银行取钱,银行的工作人员也是去后面操作ATM机器取钱,再给当事人
     * @param money
     */
    public void getMoney(int money){
        // 创建一个 ATM 机
        ATM atm = new ATM();
        int m = atm.getMoney(money);
        System.out.println("在银行柜台取钱,取了"+m+"元");
    }

    /**
     * 成员内部类(ATM机类)
     * 私有化,只允许银行的工作人员取钱
     */
    private class ATM{
        public int getMoney(int money){
            return money;
        }
    }
}
/**
 * 银行测试类- 取钱
 */
public class BankTest {
    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.getMoney(500);

    }
}
  1. public 修饰内部类(公开化)
public class ICBCbank {
    public void getMoney(int money){
        if(money <= 100000){
            System.out.println("请移步至ATM机取款,柜台不办理额度小于100000元的取款业务!");
        }
        System.out.println("在柜台取钱,人民币为"+money+"元");
    }

    /**
     * 银行ATM机内部类,public 修饰所有人均可使用
     */
    public class ATM{
        public void getMoney(int money){
            if(money > 100000){
                System.out.println("请移步至柜台进行业务办理,ATM机取款最多不能超过100000元");
            }
            System.out.println("在ATM机取款,人名币为"+money+"元");
        }
    }
}

注意:创建内部类对象的方式

public class ICBCbankTest {
    public static void main(String[] args) {
        ICBCbank icbCbank = new ICBCbank();
        // 在银行柜台取款取款
        icbCbank.getMoney(1000000);
        // 调用银行类中的 ATM 类
        //ICBCbank.ATM atm = icbCbank.new ATM();
        ICBCbank.ATM atm = new ICBCbank().new ATM();
        // 在银行的ATM机取款
        atm.getMoney(1000);
    }
}

静态内部类(相对更加常用)

  • 创建内部类对象,更加方便、简洁。
  • 修改上面代码,完成练习。
  1. ICBCbank类中ATM类,添加static修饰符
  2. ICBCbank.ATM atm = new ICBCbank.ATM(); // 静态内部类使用
    or[步骤2和3作用相同,推荐2]
  3. ATM atm = new ATM(); // 也可以导入静态类,使创建对象更加简洁

局部内部类

public class ABCBlank {
    // 银行取钱方法
    public void getMoney(int money){
        // 局部内部类,每次来银行取钱都要重新构建ATM机
        class ATM{
            public int getMoney(int money){
                return money;
            }
        }
        // 创建一个 ATM 机
        ATM atm = new ATM();
        int m = atm.getMoney(money);
        System.out.println("柜台取钱,人民币"+m+"元");
    }

    public static void main(String[] args) {
        // 构建一个 农业银行,测试局部内部类
        ABCBlank blank = new ABCBlank();
        blank.getMoney(1000);
    }
}

小知识:

  • 成员内部类、静态内部类 编译后的class字节码文件,内部类名字为:外部类名$内部类名.class
  • 局部内部类 编译后的class字节码文件,内部类名字为:外部类名$1内部类名.class