联系方式
Java服务器开发群:66728073
游戏开发者高级群:398808948
Unity3d游戏开发:286114103

Java内部类使用与总结

 二维码 492
发表时间:2016-07-18 23:35

内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。一般来说,有4中内部类:常规内部类、静态内部类、局部内部类、匿名内部类。

内部类可以是静态static的,也可用publicdefaultprotectedprivate修饰。(而外部顶级类即类名和文件名相同的只能使用publicdefault)。

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.classouter$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

1,成员内部类

   成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。

   要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。

   在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象,而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();

public class Outer {

public static void main(String[] args) {

       Outer outer = new Outer();

       Outer.Inner inner = outer.new Inner();

       inner.print("Outer.new");

       inner = outer.getInner();

       inner.print("Outer.get");

   }

   // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时

   public Inner getInner() {

       return new Inner();

   }

   //成员内部类

   public class Inner {

       public void print(String str) {

           System.out.println(str);

       }

   }

}

2,内部类中的变量访问形式

class Out {

   private int age = 12;

   

   class In {

       private int age = 13;

       public void print() {

           int age = 14;

           System.out.println("局部变量:" + age);

           System.out.println("内部类变量:" + this.age);

           System.out.println("外部类变量:" + Out.this.age);

       }

   }

}

public class Demo {

   public static void main(String[] args) {

       Out.In in = new Out().new In();

       in.print();

   }

}

运行结果:

局部变量:14

内部类变量:13

外部类变量:12

3,局部内部类

局部内部类,是指内部类定义在方法和作用域内。方法定义局部内部类同方法定义局部变量一样,不能使用privateprotectedpublic等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和   abstract修饰,方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问,static方法中定义的内部类可以访问外部类定义的static成员,Thinking in Java给了这么两个例子:

定义在方法内:

public class Parcel4 {

//返回的Destination是一个已存在的类

public Destination destination(String s) {

//这里必须依赖于接口或父类实现

       class PDestination implements Destination {

           private String label;

           private PDestination(String whereTo) {

               label = whereTo;

           }

           public String readLabel() {

               return label;

           }

       }

       return new PDestination(s);

   }

   public static void main(String[] args) {

       Parcel4 p = new Parcel4();

       Destination d = p.destination("Tasmania");

   }

}

4,静态内部类

与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,但是可以访问外部类中的static成员。这与一般类的static方法相通

class Out {

   private static int age = 12;

   

   static class In {

       public void print() {

           System.out.println(age);

       }

   }

}

public class Demo {

   public static void main(String[] args) {

       Out.In in = new Out.In();

       in.print();

   }

}

5,接口

接口是对类的一组需求描述。接口中的方法自动的属于public,所以在定义接口时,方法前的public修饰符可以去掉,接口中的属性自动的属于public static final。因此接口中的属性是常量,必须声明的时候进行初始化。例如:

public interface ITest1 {

String str = "我是接口中定义的";


String getValue();

}

实现类:

public class Test1 implements ITest1 {

public String getValue() {

// TODO Auto-generated method stub

return "我是子类实现的";

}

public static void main(String[] args) {

String interfaceStr = ITest1.str;

System.out.println(interfaceStr);

ITest1 test1 = new Test1();

System.out.println(test1.getValue());

}

}

运行结果:

我是接口中定义的

我是子类实现的


在接口中定义内部类,同样,内部类也会自动属于静态内部类,它不能访问外面接口的this指针,例如:

public interface ITest1 {

String str = "我是接口中定义的";

String getValue();

public class InterfaceInner{

public String getValue(){

return "来自接口内部类";

}

}

}

public class Test1 implements ITest1 {

public String getValue() {

// TODO Auto-generated method stub

return "我是子类实现的";

}

public static void main(String[] args) {

InterfaceInner inner = new InterfaceInner();

String value = inner.getValue();

System.out.println(value);

}

}


本文来自:游戏技术网 http://www.youxijishu.com