面向对象07
1、成员内部类
-
类中套类,外面的称为外部类,里面的则是内部类
-
内部类通常只服务于外部类,对外不可见(在其他类new不出来,必须通过外部类来访问内部类)
public class Demo01 { class TestDemo02 { } } class TestDemo01 { public static void main(String[] args) { Demo01 demo01 = new Demo01(); //TestDemo02 testDemo02 = new TestDemo02(); 编译错误,内部类对外不可见 } }
-
内部类对象通常在外部类中创建
public class Demo01 { public static void main(String[] args) { TestDemo02 testDemo02 = new TestDemo02();//在外部类中创建内部类对象 } static class TestDemo02 { }//在静态方法中只能访问静态成员 }
-
内部类中可以直接访问外部类成员(包括私有),
内部类有个隐式的引用指向了创建它的属于外部类的对象(外部类名.this)
public class Demo01 { private int a = 1; class TestDemo02 { void show(){ System.out.println(a);//可以直接访问外部类成员,包括私有 System.out.println(Demo01.this.a);//和上面同一个意思,隐式的引用外部类对象 } } }
2、匿名内部类(简化代码)
-
若想创建一个类(派生类)的对象,并且对象只被创建一次,此时可以设计为匿名内部类
public class Demo01 { int a = 1; public static void main(String[] args) { int b = 1; // TestDemo01类是抽象的,本来不能实例化 //匿名内部类相当于创建了一个没有名字的的类继承这个抽象类 //new的对象即testDemo01指向的地址实际上是这个匿名类的对象 //大括号内是这个匿名类的类体 TestDemo01 testDemo01 = new TestDemo01(){ }; //若抽象类中有抽象方法,则匿名内部类也必须重写这个方法 TestDemo02 testDemo02 = new TestDemo02(){ void show(){ // b = 2; 外部类的局部变量相当于final,不可改变 } }; testDemo02.show();//调用内部类中的方法 } } abstract class TestDemo01 { } abstract class TestDemo02 { abstract void show(); }
-
匿名内部类中不能修饰外面局部变量的值,因为该变量在此处默认为final的------------API时会用
-
问:内部类有独立的.class吗?
答:有
补充:
隐式的引用:
this:指代当前对象
super:指代当前对象的超类对象
外部类名.this:指代当前对象的外部类对象
\2. 做功能的套路:
先写行为/方法:
若为某个派生类所特有的功能/行为,则将方法设计在特定的类中
若为所有派生类所共有的功能/行为,则将方法设计在超类中
窗口调用:
若为定时发生的,则在定时器中调用
若为事件触发的,则在侦听器中调用-----------------明天讲
\3. 如何调错:
先快速锁定问题方法:
将调用方法的代码都注释掉,然后一个一个的放开,放开哪个方法出错,说明问题就出在哪个方法上
打桩:
System.out.println(数据);
\4. 文档注释:
是功能性注释,描述整个类是干什么的,方法是干什么的,常量是干什么的。
一般写在类上、方法上、常量上。