<1>成员内部类
可以将一个类的定义放在另一个类的内部定义,这就是内部类。
1、成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。
2、在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式
3、创建成员内部类的实例使用“外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)”的形式。在创建内部类实例之前需要先创建外部类的实例对象。
public class Namer {
private String name ;
private int age;
class InnerClass{
public InnerClass(){
name = "chenssy";
age = 23;
}
}
}
我们应该在什么时候用到内部类呢?
在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
<2>局部内部类
定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
1、局部内部类只能在代码代码块、方法体内和作用域中使用(创建对象和使用类对象).
class A{
public A(){
}
public People getB(){
class B extends People{
int age =0;
}
return new B();
}
}
<3>匿名内部类
匿名内部类是唯一一种没有构造器的类,一般用于继承其他类或是实现接口,不需要增加额外的方法,只是对继承方法的实现或是重写
public class A{
public BB{
return B{
System.out.println("我是匿名内部类的代码块");
};//分号表示表达式的结束;
}
}
<4>静态内部类
使用static修饰的成员内部类叫静态内部类。
1、静态内部类更外部类没有任何关系,只是在生成类名和类定义时有影响。静态内部类可以看做是与外部类平级的类。使用方式与外部类平级的类完全相同。
2、静态内部类不能访问外部类的非静态的属性和方法。外部类不能访问内部类的非静态的属性和方法。
3、静态内部类创建实例的形式:外部类名.内部类名 实例名 = new外部类名.内部类名(参数)
class Outer {
static class Inner {
void go() {
System.out.println("内部类引用" + this);
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner n = new Outer.Inner();
n.go();
}
}