第四章 面向对象-内部类
- 将一个类定义在另一个类里面,对里面那个类就称为内部类(内置类、嵌套类)。
- 访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。
外部类要访问内部类中的成员必须要建立内部类的对象。 - 实现:
class Outer{
//内部类
class Inner{
}
}
在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述的事物内容。这时就是还有的事物定义成内部类来描述。
- 直接访问外部类中的内部类成员:
class Outer{
//内部类
class Inner{
void show(){
System.out.print("Inner");
}
}
}
class InnerDemo{
public static void main(String[] args){
//直接访问外部类中的内部类成员
Outer.Inner i=new Outer().new Inner();
i.show();
}
}
- 静态内部类:
class Outer{
private static int num=5;
//内部类
static class Inner{
void show(){
System.out.print("Inner"+num);
}
static void function(){
System.out.print("function run - "+num);
}
}
}
class InnerDemo{
public static void main(String[] args){
//如果内部类是静态的,相当于一个外部类。
Outer.Inner i=new Outer.Inner();
i.show();//Inner5
//如果内部类是静态的,成员也是静态的。
Outer.Inner.function();
}
}
注意:静态内部类访问外部类成员时,该成员必须也是静态的,否则编译失败。
如果内部类中成员是静态的,那么该内部类也必须是静态的,因为当成员是静态时就不需要对象了,如果内部类非静态就不能通过类名.成员调用静态成员了。
- 内部类访问变量:
class Outer{
int num=5;
static class Inner{
int num=4;
void show(){
int num=3;
// 3
System.out.print("Inner"+num);
// 4
System.out.print("Inner"+this.num);
//
System.out.print("Inner"+Outer.this.num);
}
}
void method(){
new Inner().show();
}
}
class InnerDemo{
public static void main(String[] args){
new Outer().method();
}
}
- 为什么内部类能直接访问外部类成员呢?
那是因为内部类持有了外部类的引用,外部类名.this - 内部类放在局部位置上:
class Outer{
int num=5;
static class Inner{
int num=4;
void show(){
int num=3;
// 3
System.out.print("Inner"+num);
// 4
System.out.print("Inner"+this.num);
//
System.out.print("Inner"+Outer.this.num);
}
}
void method(){
final int x=6;
class Inner{
void show(){
System.out.print("Inner show"+x);
}
}
Inner in=new Inner();
in.show();
}
}
class InnerDemo{
public static void main(String[] args){
new Outer().method();
}
}
内部类在局部位置上只能访问局部中被final修饰的局部变量。(常量)
- 匿名内部类
- 匿名内部类就是内部类的简写形式。,其实就是一个匿名子类对象。
- 前提:内部类必须继承或实现一个外部类或接口。
- 格式:new 父类or接口( ){子类内容}
abstract Demo{
abstract void show();
}
class Outer{
int num=4;
public void method(){
/*class Inner extends Demo{
void show(){
System.out.print("show run");
}
}*/
new Demo(){
void show(){
System.out.print("show run"+num);
}
}.show();
}
}
- 应用:
interface Demo{
void show1();
void show2();
}
class Outer{
int num=4;
public void method(){
Demo d=new Demo(){
public void show1(){}
public void show2(){}
}
};
d.show1();
d.show2();
}
class Fu{
Fu(){
System.out.print("Fu run");
show();
}
void show(){
System.out.print("Fu show run");
}
}
class Zi extends Fu{
itn num=5;
{
System.out.print("code run");
num=7;
}
Zi(){
super();
//显示初始化
System.out.print("Zi run"+num);
}
void show(){
System.out.print("show run"+num);
}
}
class Demo{
public static void main(String[] args){
new Zi();
}
}
- 对象的初始化过程: