内部类定义
内部类就是在一个类的内部定义一个类,比如,A类中定义一个B类,那么B类相对于A类就称为内部类,而A类相对B类就是外部类了。
下面这种方法也是内部类,相当于大的Java文件中写了两个不同的类
并且下面这个class A 不能被声明成public,一个java类中只能有一个public class
但是可以有多个class。
1.成员内部类
成员内部类是最基础的内部类。
当定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象
内部类可以调用外部类的属性。
2.静态内部类
静态内部类就是用static修饰的内部类,静态内部类不能直接访问外部类的非静态成员,但可以通过new 外部类().成员的方式访问。
这个内部类属于外部类本身,但是不属于外部类的任何对象。因此使用static修饰的内部类称为静态内部类。静态内部类有如下规则:
静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
package com.zhang.oop.Demo08;
public class Demo01 {
private String name = "这是一个实例变量";
private int age = 18;
// 成员内部类前加上static就是静态内部类 它的级别和外部类相同
static class Inner{
private String address = "上海";
private String phone = "123456";
private static int count = 10000;
public void show(){
// 怎么调用外部类的属性?
// 因为它的级别和另一个外部类相同,所以可以把他当成另一个类来看
// 先创建外部类对象,再调用
Demo01 demo01 = new Demo01();
System.out.println(demo01.name);
System.out.println(demo01.age);
// 调用静态内部类的属性和方法
System.out.println(address);
System.out.println(phone);
// 调用静态内部类的静态属性
System.out.println(Inner.count);
}
}
}
3.局部内部类
package com.zhang.oop.Demo08;
public class Outer {
private String s1 = "this is s1 in Outer";
private String s_outer = "this is s_outer in Outer";
private String method1() {
return "this is method1 in Outer";
}
private String method2() {
return "this is method2 in Outer";
}
public void method3() {
final String s_method = "this is s_method in method3";
class Inner {
private String s1 = "this is s1 in Inner";
public void method1() {
// 内部类访问外部方法的变量,需要有final修饰
System.out.println(s_method);
// 局部内部类可直接访问外部类的变量,即使是私有的
System.out.println(s_outer);
// 内部类和外部类有同名变量和方法时
System.out.println(s1);
System.out.println(Outer.this.s1);
System.out.println(method2());
System.out.println(Outer.this.method2());
}
private String method2() {
return "this is method2 in Inner";
}
}
Inner inner = new Inner();
inner.method1();
}
public static class MainClass {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method3();
}
}
}
4.匿名内部类
package com.zhang.oop.Demo08;
public class Text {
public static void main(String[] args) {
//匿名内部类 没有名字初始化类 不用将实例保存在变量中。
new Apple().eat();
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}