外部类:外部类必须是public,不能更改访问权限修饰符。
内部类: 把一个类写在了另一个类或方法中, 可以设置访问权限修饰符。
成员内部类
- 在类中创建的类称为成员内部类。
- 可以拥有private、protected访问权限修饰符。
- 实例化是时必须先new出外部类的对象。
- 外部类和内部类属性同名,默认使用内部类。
- 若要使用外部类的方法和属性:外部类名.this.变量名或方法名
局部内部类
被定义在某个方法或者代码块中。 仅限于方法体内使用。
匿名内部类
没有名称
所有的匿名内部类必须继承一个类或实现一个接口。
匿名内部类引用外部参数时,必须为常量。
静态内部类
被static修饰的成员内部类是静态内部类
不依赖于外部类,可以直接创建对象。
外部类和内部类会生成两个class文件,内部类有外部类的指针引用存在。
代码示例
public abstract class Animal {
public abstract void eat();
}
public interface Fly {
void fly();
}
public class Demo {
private String name="小黑";
private int age=9;
/*
* 成员内部类
*/
class Inner{
private String name="小白";
private int age=10;
public void say(){
System.out.println("InnerClass:name是"+name+"\tage是"+age);
System.out.println("Demo:name是"+Demo.this.name+"\tage是"+Demo.this.age);
}
}
/*
* 静态成员内部类
*/
static class InnerTwo{
private String name="小红";
private int age=11;
public void say(){
System.out.println("static class Inner :name是"+name+"\tage是"+age);
}
}
/*
* 局部内部类
*/
public void getMessage(final String name){
class InnerMethod{
private int age=12;
public void say(){
System.out.println("Demo:getMessage是"+name+"\tage是"+Demo.this.age);
}
}
InnerMethod inme=new InnerMethod();
inme.say();
}
/*
* 匿名内部类
*/
class Noname{
public void noName(final String name){
Animal dog=new Animal() {
@Override
public void eat() {
System.out.println("形参中的name是"+name+"\tDemo:name是"+Demo.this.age);
}
};
dog.eat();
}
}
class Noname2{
public void noName(final String name){
Fly bird=new Fly() {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("形参中的name:"+name+"\tage是"+Demo.this.age);
}
};
bird.fly();
}
}
}
public class Test {
public static void main(String[] args) {
/*
* 实例化成员内部类
*/
Inner inner=new Demo().new Inner();
inner.say();
/*
* 实例化静态内部类
*/
InnerTwo innertwo=new InnerTwo();
innertwo.say();
/*
* 调用局部内部类
*/
Demo demo=new Demo();
demo.getMessage("sdf");
/*
* 匿名内部类实例化
*/
Noname noname=new Demo().new Noname();
noname.noName("堆堆");
/*
* 匿名内部类实例化
*/
Noname2 noname2=new Demo().new Noname2();
noname2.noName("怼怼");
}
}
InnerClass:name是小白 age是10
Demo:name是小黑 age是9
static class Inner :name是小红 age是11
Demo:getMessage是sdf age是9
形参中的name是堆堆 Demo:name是9
形参中的name:怼怼 age是9
为何局部内部类和匿名内部类里只能接收final的参数呢?
https://www.cnblogs.com/dolphin0520/p/3811445.html