——- android培训、java培训、期待与您交流! ———-
非静态成员内部类
class Outer{
class Inner{
}
}
其他的类可以通过 Outer.Inner inner = new Outer().new Inner();
来创建成员内部类对象;
当成员内部类用private
修饰时,其他的类不能创建内部类对象,此时只能在外部类里创建内部类对象;
静态成员内部类
class Outer{
static class Inner{
}
}
其他的类可以通过Outer.Inner inner = Outer.new Inner();
或new Outer.Inner()
;来创建内部类对象;静态类的全名为OuterClass.InnerClass。
静态内部类可包括静态成员也可包括非静态成员。根据静态成员不能访问非静态成员的规定,所以静态内部类不能访问外部类实例成员,只能访问外部类的静态成员;
class Outer{
private String name = "name";
private static int age =17;
static class Inner{
private String str="InnerName";
private static int i =10;
public void show(){
//System.out.println(name);//静态成员不能访问非静态成员
System.out.println(age);//可以访问
System.out.println(new Outer().name);//可以访问
}
}
public void test (){
//System.out.println(str);//不能访问,和str不在同一代码块
System.out.println(new Inner().str);//可以访问
System.out.println(Inner.i);//可以访问
new Inner().show();
}
}
局部内部类
定义在方法体里的内部类,不能在宿主类以外的地方使用,局部内部类也不能使用访问修饰符和static修饰;
局部内部类只能访问方法中final修饰的局部变量:因为final修饰的变量相当于一个常量,其生命周期超出了方法运行的生命周期;
public class Outer {
String name = "name";
public static void main(String[] args) {
new Outer().show ();
}
public void show(){
final int i = 1;
String s = "s";
class Inner{
public void test (){
System.out.println(i);
//System.out.println(s);不能访问
System.out.println(name);
}
}
new Inner().test();
}
}
匿名内部类
适合只使用一次的类
不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
匿名内部类不能定义构造器,因为匿名内部类没有类名。
匿名内部类必须继承一个父类或者实现一个接口,但最多只能一个父类或实现一个接口;
new 父类构造器【或接口】(实参列表){
类体,可覆写父类方法或实现父类抽象方法
}
public class UnnameInnerClass {
public static void main(String[] args) {
final String s = "常量";
new demo1(){
@Override
public void show() {
System.out.println("实现抽象类的匿名内部类");
System.out.println(s);
}}.show();
new demo2(){
@Override
public void show() {
System.out.println("实现接口的匿名内部类");
System.out.println(s);
}}.show();
new demo3(){
public void show() {
System.out.println("匿名类的show方法");
}
}.show();//最终会执行匿名类的show方法
}
}
abstract class demo1{
abstract public void show();
}
interface demo2{
public void show();
}
class demo3{
public void show() {
System.out.println("父类 的show方法");
}
}