第一种,普通内部类:
package test;
public class Tstatic {
class InnerDemo{
public void test(){
System.out.println("hello");
}
}
public static void main(String[] args) {
Tstatic ts = new Tstatic();
Tstatic.InnerDemo d = ts.new InnerDemo();//只能通过ts内部实例
d.test();
ts.getDemo().test(); //或者外部类实例的方法。
}
public InnerDemo getDemo(){
return new Tstatic.InnerDemo();
}
}
普通内部类,由于是用非static修饰的,所以,只能在外部类的实例对象中内部类。
第二种,静态内部类:
package test;
import test.Tstatic.InnerDemo;
public class Tstatic {
static class InnerDemo{
public void test(){
System.out.println("hello");
}
}
public static void main(String[] args) {
Tstatic ts = new Tstatic();
new InnerDemo().test(); //可以直接创建InnerDemo对象,不用通过ts外部类实例。
new TestDemo().getInner().test();
}
public InnerDemo getDemo(){
return new InnerDemo();
}
}
class TestDemo{
public Tstatic.InnerDemo getInner(){
try {
return Tstatic.InnerDemo.class.newInstance(); //可以直接通过类名调用不会抛出异常,如果InnerDemo没有static修饰,就会抛出异常。
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// return new Tstatic.InnerDemo();
return null;
}
}
静态内部类,可以直接在外部类的static修饰的方法中直接调用,或者可以直接在有权限的其他外部类中调用。其实无论是不是static修饰,他就和变量是一样的。
第三种,匿名内部类:
- 匿名内部类也就是没有名字的内部类
- 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
- 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
其实和其他变量一样,首先要有声明类型,所以,匿名内部类必须继承一个父类或实现一个接口
第四种,局部类:
就是在方法里面定义类,然后只能在该方法中创建实例,只能访问外部类中final类型的变量,
感觉作用不大,也很少用到过,就不多做介绍了。有问题可以交流。