1.成员内部类:
1.1.类中套类,外面的称为外部类,里面的称为内部类
1.2.内部类通常只服务于外部类,对外不具备可见性
1.3.内部类对象通常在外部类中创建
1.4.内部类中可以直接访问外部类的成员(包括私有的)
内部类中有一个隐式的引用,指向了创建它的外部类对象
外部类名.this:指代当前对象的外部类对象
public class Test {
public static void main(String[] args) {
Aoo o1= new Aoo(); //
// Boo o2= new Boo(); //编译错误,内部类对外不具备可见性
}
}
class Aoo{ //外部类
int a;
Boo o= new Boo();
class Boo{ //成员内部类
void show(){
System.out.println(a); //这是简写
System.out.println(Aoo.this.a); //这是完整写法
}
}
}
2.匿名内部类:
2.1.若想创建一个类的对象,并且对象只被创建一次,此时可以设计为匿名内部类
2.2.在匿名内部类中是不能修改外面局部变量的值,因为在此处该变量的值会默认为final
2.3.内部类有独立的.class
3.做功能的套路:
3.1.先写行为方法
3.1.1.若为子类所特有的行为,则将方法设计在特定的类中
3.1.2.若为所有子类所共有的行为则将方法设计在超类中
3.2.窗口调用
3.3.调用方法的注意事项:
3.3.1.若方法是有返回值的,则必须声明对应类型的变量来接收
3.3.2.调用时
-若与方法在同一类中可以直接调用
-若不在同一个类中,则需要通过引用名打点调用
-若方法为静态的,则直接通过类名打点来调用
4.隐式的引用:
4.1.this:指代当前对象
4.2.super:指代当前对象的超类对象
4.3.外部类名.this:指代当前对象的外部类对象
5.错误分类:
5.1.编译错误--------违反语法规则
5.2.异常--------运行时发生,找到@后的链接点击
5.3.程序的运行结果与预期不符
public class NstInnerClassDemo {
public static void main(String[] args) {
//对于匿名内部类而言
//Ao---------------父类
//NstInnerClassDemo---------外部类
Ao o1 = new Ao(){};
//1.创建了一个Ao的派生类,但是没有名字
//2.为该派生类创建了一个对象,名为o1------new Ao(){}的派类的对象
//3.{}中的为子类的类体,如果有抽象方法则必须重写
Ao o2 = new Ao(){};
//1.创建了一个Ao的派生类,但是没有名字
//2.为该派生类创建了一个对象,名为o1------new Ao(){}的派类的对象
//3.{}中的为子类的类体,如果有抽象方法则必须重写
//Boo o3 = new Boo(){
//}; //编译错误
int num =5;
num =55;
Boo o4 =new Boo() {
void show() {
System.out.println("show");
//num =53; //编译错误,匿名内部类中不能修改外面局部变量的值
//因为在此处该变量的值会默认为final
}
};
o4.show();
//1.创建了一个Boo的派生类,但是没有名字
//2.为该派生类创建了一个对象,名为o3------new Boo(){}的派类的对象
//3.{}中的为子类的类体,如果有抽象方法则必须重写
}
}
abstract class Boo{
abstract void show();
}
class Bo extends Ao{
}
abstract class Ao{
}