Java内部类:
内部类:内置类,嵌套类。
将类定义在另一个类中,该类就是内部类。类中定义的类就是内部类。
访问方式:
内部类可以直接访问外部类中的成员。
外部类想要访问内部类,需要建立内部类对象。
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来访问A类中的成员。这时,就将A类定义成B类的内部类。
class outer{
private int num = 3;
class Inner{
void show(){
System.out.println(num);
}
}
void methor(){
Inner in = new Inner();
in.show();
}
}
什么时候定义内部类?
当分析一个事物时,该事物的内部还有具体的事物,这个具体的事物在使用该事物中
的其他成员。内部类通常都不会直接对外提供,都会封装到外部类中,外部一般会通过
对外提供方法的形式对其进行访问。
内部类的使用情况:
只有默认修饰符,或者public修饰符时,可以被外部类直接访问到。
注意要保证的是该内部类必须定义在外部类的成员位置上。
外部类名.内部类名 变量 = 外部类对象.内部类名对象;
Outer.Inner in = new Outer().new Inner();
但是一般不会这么用,因为内部类都会被外部类隐藏,通常都是外部类提供方法获取内部类的对象,通常内部类会被private私有化。
当内部类中如果有静态成员时,该内部类也必须是静态的。
而静态内部类只能访问外部类中的静态成员。
在执行static内部类方法时,两种情况。
1.内部类静态,但是方法没静态。
该方法需要被对象调用执行。
new Outer.Inner();//产生了一个静态内部类的对象
in.show();
2.内部类是静态,而且方法也是静态的。
静态内部类随着对象的加载就已经存在了,静态方法随着内部类的加载也存在了。
这时就不需要对象了。
Outer.Inner.show();
非静态的内部类之所以可以直接访问外部类中的成员,那是因为内部类中都持有一个外部类对象引用:外部类名.this
内部类定义在类中的局部位置:
class Outer{
int num = 4;
public void metod(){
final int x = 3;
class Inner{
void show(){
System.out.println(Outer.this. num);
System.out.println(x);
}
}
new Inner().show
}
}
x必须设置成final;
内部类编译时会生成class文件,外部类$内部类.class
局部内部类生成的是外部类$编号内部类.class
匿名内部类:
没有名字的内部类。
好处:简化了内部类的书写。
前提:内部类必须要继承或者实现了一个外部类或外部接口
格式:
abstract class AbsDemo{
abstract void show();
}
class Outer{
new AbsDemo(){ //创建了一个匿名内部类
void show(){
System.out.println(num);
}
}.show();
}
new 父类名或接口(){里面定义该父类或者接口的子类的成员}
什么时候使用匿名内部类?
当函数的参数是一个接口类型的引用,而且该接口中的方法不超过3个。
这时可以给这个函数传递一个匿名内部类实际参数传入。简化书写
匿名内部类其实就是一种简化形式。在父类方法较少的时候可以使用简化书写。
内部类:内置类,嵌套类。
将类定义在另一个类中,该类就是内部类。类中定义的类就是内部类。
访问方式:
内部类可以直接访问外部类中的成员。
外部类想要访问内部类,需要建立内部类对象。
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来访问A类中的成员。这时,就将A类定义成B类的内部类。
class outer{
private int num = 3;
class Inner{
void show(){
System.out.println(num);
}
}
void methor(){
Inner in = new Inner();
in.show();
}
}
什么时候定义内部类?
当分析一个事物时,该事物的内部还有具体的事物,这个具体的事物在使用该事物中
的其他成员。内部类通常都不会直接对外提供,都会封装到外部类中,外部一般会通过
对外提供方法的形式对其进行访问。
内部类的使用情况:
只有默认修饰符,或者public修饰符时,可以被外部类直接访问到。
注意要保证的是该内部类必须定义在外部类的成员位置上。
外部类名.内部类名 变量 = 外部类对象.内部类名对象;
Outer.Inner in = new Outer().new Inner();
但是一般不会这么用,因为内部类都会被外部类隐藏,通常都是外部类提供方法获取内部类的对象,通常内部类会被private私有化。
当内部类中如果有静态成员时,该内部类也必须是静态的。
而静态内部类只能访问外部类中的静态成员。
在执行static内部类方法时,两种情况。
1.内部类静态,但是方法没静态。
该方法需要被对象调用执行。
new Outer.Inner();//产生了一个静态内部类的对象
in.show();
2.内部类是静态,而且方法也是静态的。
静态内部类随着对象的加载就已经存在了,静态方法随着内部类的加载也存在了。
这时就不需要对象了。
Outer.Inner.show();
非静态的内部类之所以可以直接访问外部类中的成员,那是因为内部类中都持有一个外部类对象引用:外部类名.this
内部类定义在类中的局部位置:
class Outer{
int num = 4;
public void metod(){
final int x = 3;
class Inner{
void show(){
System.out.println(Outer.this. num);
System.out.println(x);
}
}
new Inner().show
}
}
x必须设置成final;
内部类编译时会生成class文件,外部类$内部类.class
局部内部类生成的是外部类$编号内部类.class
匿名内部类:
没有名字的内部类。
好处:简化了内部类的书写。
前提:内部类必须要继承或者实现了一个外部类或外部接口
格式:
abstract class AbsDemo{
abstract void show();
}
class Outer{
new AbsDemo(){ //创建了一个匿名内部类
void show(){
System.out.println(num);
}
}.show();
}
new 父类名或接口(){里面定义该父类或者接口的子类的成员}
什么时候使用匿名内部类?
当函数的参数是一个接口类型的引用,而且该接口中的方法不超过3个。
这时可以给这个函数传递一个匿名内部类实际参数传入。简化书写
匿名内部类其实就是一种简化形式。在父类方法较少的时候可以使用简化书写。