一,内部类
1.概念:在- -类的内部定义-个完整的类
2.语法
class outer{
class Inner{
}
3.特点
●编译之后可以生成独立的字节码文件(外部类类名$内部类类名.class )
●内部类可以直接访问外部类的私有成员,而不破坏封装
●可以为外部类提供功能组件
4、内部类分类
1.成员内部类
。定义在类的内部,与成员变量同级(对比成员变量进行学习)
。创建内部类的对象,必须依赖外部类对象(内部类是外部类的成员)
outer o=new outerO;/ /创建外部类对象
Inner i=o . new InnerO ;//创建内部类对象
。成员内部类可以直接访问外部类的私有属性
。当内部类中有变 量和外部类属性重名时,优先使用内部类中的变量
b访问外部类属性外部类米名.this. 属性名
2.静态内部类
。位置:类的内部,方法的外部,被static修饰(对比静态变量)
class outer{
static class Inner{}
}
0创建对象,必须依赖外部类类名
Inner i=new outer . InnerO;
。静态内部类中可以定义静态成员,访问直接使用类名
■Outer .Inner.静态属性名
■Outer .Inner.静态方法名(参数) ;
。静态内部类中只能访问外部类的静态成员(静态属性和静态方法)
package innerclass.member;
import innerclass.member.Outer.Inner;
public class TestMemberInnerClass {
public static void main(String[] args) {
//创建外部类对象
Outer o = new Outer();
//创建内部类对象
Inner i=o.new Inner();
//System.out.println(i.a);
i.m1();
//System.out.println(i.a);
}
}
//外部类
class Outer{
//属性
private int a=10;
//方法
public void m() {}
//构造方法
//代码块
//成员内部类
class Inner{
//属性
int a=20;
//方法
public void m1() {
int a=30;
System.out.println(a);//30,优先局部变量
System.out.println(this.a);//在外部类的属性和内部类的属性重名时优先访问内部类属性
System.out.println(Outer.this.a);//访问外部类属性 外部类类名.this.属性名
System.out.println("m1()----");
}
}
}
静态内部类
package innerclass.staticinner;
public class TestStaticInnerClass {
public static void main(String[] args) {
// 不必依赖外部类对象,需要依赖外部类类名
Outer.Inner i=new Outer.Inner();
System.out.println(i.a);
System.out.println(Outer.Inner.b);
i.m();
}
}
//外部类
class Outer{
static int c=30;
//静态内部类
static class Inner{
int a=10;
static int b=20;
public void m() {
System.out.println(c);
}
}
}