内部类
- 在一个类内部定义的类,属于外部类的成员
- 成员和成员之间可以相互使用(成员内部类可以直接使用外部类成员)
- 字节码:Outer**$**Inner.class
class Outer{//外部类
private int num=88; //成员变量
class Inner{ //成员内部类
public void show(){
System.out.println("he11o"+num) ;
}
}
public void fun(){//成员方法
Inner in=new Inner();
in.show();
}
}
class Demo1{
public static void main(String[] args){
Outer out=new Outer();
out.fun();
//创建内部类对象
Outer.Inner in=new Outer().new Inner();
in.show();
}
}
静态内部类
-
静态方法只能使用静态成员
非静态方法既可以使用静态成员,也可以使用非静态的成员 -
随着类的加载就加载到静态区,可以直接通过类访问
-
内部类中含有静态成员,内部类必须是静态的
-
调用静态内部类中的show方法
class Outer{//外部类 static class Inner{ //成员内部类 public void show(){ System.out.println("he11o") ; } } } class Demo1{ public static void main(String[] args){ Outer.Inner in=new Outer.Inner(); in.show(); } }
-
调用静态内部类中的静态show方法
class Outer{//外部类 static class Inner{ //成员内部类 public static void show(){ System.out.println("he11o") ; } } } class Demo1{ public static void main(String[] args){ Outer.Inner.show(); } }
-
调用内部类中的静态show方法 编译不通过
内部类中含有静态成员,内部类必须是静态的
class Outer{//外部类 class Inner{ //成员内部类 public static void show(){ System.out.println("he11o") ; } } } class Demo1{ public static void main(String[] args){ new Outer().new Inner(); } }
-
内部类访问外部类中同名的成员:外部类名.this.成员名
class Outer{ private int num=666; class Inner{ private int num=66; public void show(){ int num=6; System.out.println(num);//6 System.out.println(this.num);//66 System.out.println(Outer.this.num);//666 } } public void fun(){ Inner in=new Inner(); in.show(); } } class Demo3{ public static void main(String[] args){ Outer out=new Outer(); out.fun(); } }
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。
匿名内部类
为了简化书写
创建父类的子类对象,必须要有父类
class Test{
public abstract void show();
}
class Outer{
class Inner extends Test{
public void show(){}
public void fun(){}
}
public void ff(){
new Test(){
public void show(){}
public void fun(){}
}.show();
new Test(){
public void show(){}
public void fun(){}
}.fun();
//多态 父类类型的引用指向了子类对象
Test test =new Test(){
public void show(){}
public void fun(){}
};
test.show();
//test.fun();//父类没有定义fun方法
}
}
练习:匿名内部类、重写toString
class Demo4 { public static void main(String[] args) { System.out.println(new Object(){ int age=18; String name="李四"; public String toString(){ return name+','+age; } });//李四,18 } }
接口
interface inter{
public abstract void show( );
}
class Demo5
{
public static void main(String[] args){
//Test tt=new Test();
//创建接口的子类对象
fun(new inter(){
public void show(){
System.out.println("show");
}
});
}
public static void fun(inter in)// inter in=new Test();
{
in.show();
}
}
/*
class Test implements inter
{
public void show(){
System.out.println("show");
}
}*/
补全代码
interface inter{ public abstract void show(); } class Demo6{ public static void main(String[] args){ Test.method().show(); } }
interface inter{ public abstract void show(); } class Test { public static inter method(){ return new inter(){ public void show(){ System.out.println("show"); } }; } } class Demo6{ public static void main(String[] args){ Test.method().show(); } }