一、对象的创建过程
- 分配空间
- 初始化 属性,若有赋值操作,则进行赋值
- 加载代码块
- 对未赋值的属性,进行赋值(默认值)
- 将类中的所有 成员方法,加入到 内存中
- 调用构造方法,完成对象的创建
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);
}
}
二、内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名类
成员内部类
- 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);
}
}
- 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);
}
}
静态内部类(相对更加常用)
- 创建内部类对象,更加方便、简洁。
- 修改上面代码,完成练习。
- ICBCbank类中ATM类,添加static修饰符
- ICBCbank.ATM atm = new ICBCbank.ATM(); // 静态内部类使用
or[步骤2和3作用相同,推荐2] - 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