------
内部类:在一个类中又声明了一个类
class A { //外部类
class B { //内部类
}
}
1.常规用法
public class Demo13 {
public static void main(String[] args) {
Father2 f = new Son1();
f.show();
//f.print();//此处不能调用父类中没有声明而子类中特有的方法
}
}
class Father2 {
void show() {
System.out.println("father.show");
}
}
class Son1 extends Father2 {
void show() {
System.out.println("son.show");
}
void print(){
System.out.println("son.print");
}
}
2.用匿名类创建对象
public class Demo13 {
public static void main(String[] args) {
/*
* 使用内部类创建对象
* 在父类基础上new一个匿名内部类赋值给父类对象
* 类内写方法调用
* */
Father2 f = new Father2() {
void show() {
System.out.println("son.show");
}
void print(){
System.out.println("son.print");
}
};
f.show();
//f.print();//此处不能调用父类中没有声明而子类中特有的方法
}
}
class Father2 {
void show() {
System.out.println("father.show");
}
}
内部类有什么作用?
内部类一般是在分析阶段.发现某一个实体是另外一个实体的不可分割的一部分.
class 人 {
class 心脏 {
}
class 脑 {
}
}
内部类的定义位置:
1.内部类可以声明在类的成员位置上,对于这一种情况,内部类是可以使用成员修饰符的.
2.内部类可以声明在方法内.
内部访问: (重点)
1.内部类声明在成员位置上 (上面的常规用法)
对于内部类来说它可以直接访问外部类的成员.
应用的比较多的访问方式:
在外部类定义方法,去访问内部类的成员
在外部去直接访问内部类的成员
①非static修饰的内部类
外部类名.内部类名 引用 = new 外部类名().new 内部类名();
②static修饰的内部类
外部类名.内部类名 引用 = new 外部类.内部类();
2.内部类定义在局部位置上(定义在方法内.例如上面的使用匿名内部类创建对象简化方式)
只能在局部位置创建内部类的对象去访问.
内部类在局部位置注意事项:
a.内部类可以直接访问外部类成员
b.内部类可以直接访问局部变量,局部变量必须使用final修饰
c.内部类中如果出现与外部类同名的成员.
这个时候的this代表的是内部类对象,而要使用外部类
需要 外部类名.this 这个代表的是外部类的对象
关于内部类声明在成员位置上时它的static修饰的问题
1.如果内部类使用static修饰,在内部类中就不能直接访问外部类的非static成员
2.如果内部类中有static成员,内部类必须使用static修饰.
3.如果内部类使用static修饰,那内部类的成员可以是static,也可以不是
内部类声明在成员位置上关于修饰符的补充:
如果开发内部类一般会使用private,这时候只能适合我们所说的第一种方式方法
如果是非private可是使用其他方式.
内部类产生的.class文件特点:
在成员位置 外部类名$内部类名.class
在局部位置 外部类名$序号内部类名.class
使用内部类的简化方式在以后的图形化界面中会经常使用.
------