类的五大成员:属性,方法,构造器,代码块,内部类
1.内部类
public class Factory {
public static void main(String[] args) {
Outer outer = new Outer();
outer.func();
}
}
class Outer{
private int n1=10;
private void outer(){
System.out.println("外部类的私有方法执行");
}
public void func(){
class Inner{
public void func1(){
//局部内部类可以直接访问外部类成员
System.out.println(n1);
outer();
}
}
Inner inner= new Inner();
inner.func1();
}
}
attention:
外部其他类不能访问局部内部类
内部类属性或方法和外部类重名时,符合就近原则,如果想调用外部类的属性,可以用语法:Outer.this.n1即可访问外部类的n1属性
2.匿名内部类AnoymousInnerClass
1.本质是类
2.该类没有名字
3.该类同时是一个对象
匿名内部类定义在外部类的局部位置,比如方法
语法:
new 类或接口(参数){
类体
};
传统方式实现接口:
interface animal{
public void roar();
}
class tiger implements animal{
@Override
public void roar() {
System.out.println("awu");
}
}
如果实现接口的类只使用一次,可以创建匿名内部类
public class Factory {
public static void main(String[] args) {
Animal animal = new Animal() {
@Override
public void roar() {
System.out.println("awu");
System.out.println(this.getClass().getName());
}
};
animal.roar();
}
}
interface Animal{
public void roar();
}
运行结果:
可见匿名内部类在这里的类名为:Factory$1
animal的编译类型:Animal
animal的运行类型:Factory$1
也可以这样调用:
public class Factory {
public static void main(String[] args) {
new Animal() {
@Override
public void roar() {
System.out.println("awu");
System.out.println(this.getClass().getName());
}
}.roar();
}
}
interface Animal{
public void roar();
}
3.成员内部类
成员内部类可以使用修饰符
//创建内部类实例的第一种方法
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.say();
}
}
class Outer{
int i;
private class Inner{
public void run(){
System.out.println(i);
}
}
public void say(){
Inner inner= new Inner();
inner.run();
}
}
4.静态内部类
静态内部类只能访问外部类的静态成员和方法
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.run();
}
}
class Outer{
static int i;
static class Inner{
public void run(){
System.out.println(i);
}
}
}