内部类和外部类
将一个类定义在一个类或者一个方法里面,这样的类称着内部类 。
一、成员内部类
成员内部类就是位于外部类成员位置的类,与外部类的成员和方法是并列的。成员内部类对象的创建依赖于外部类,并且内部类的对象持有指向外部类对象的引用(这个引用是编译器自动给的),所以在内部类中可以直接访问外部类的属性和方法
- 内部类可以直接访问外部类的私有属性。
public class Person {
private int id = 123;
private int age = 20;
private String name = "zhang";
class Inner{//内部类
public void print() {
System.out.println(id);
}
}
}
class Test {
public static void main(String[] agrs){
Person p = new Person();
Person.Inner in = p.new Inner();//创建Inner内部类的对象
in.print();//输出123-----通过内部类Inner的对象直接访问了外部类Person的私有属性
}
}
- 外部类不能直接访问内部类的属性,要想访问必须在外部类中先对内部类进行实例化,通过内部类的对象进行访问
public class Person {
private int id = 123;
private int age = 20;
private String name = "zhang";
class Inner{//内部类
private int height = 175;
public void print() {
System.out.println(id);
}
}
Inner in = new Inner();//在外部类中创建内部类对象
public void out(){
System.out.println(in.height);//访问内部类的属性
}
public static void main(String[] agrs){
Person p = new Person();
p.out();//通过外部类访问内部类的成员属性,输出175
}
}
-
在成员内部类中的方法和属性都不能用
static
来修饰,如果用了static
来修饰的话就会报错
二、静态内部类
成员内部类不能用static
来修饰,但是有专门用static
来修饰的静态内部类,静态内部类可以用来调用外部类的静态方法和属性,如果用来调用非静态变量或者方法则会报错
public class Person {
private static int id = 123;
private static int age = 20;
private String name = "zhang";
static class Inner{//静态内部类
private static int height = 175;
private String address = "shanghai";
public static void print() {
System.out.println(id);
}
public static void print1() {
Person.out3();
}
}
Inner in = new Inner();//创建对象来调用内部类的非静态变量
public static void out(){
System.out.println(Inner.height);
}
public void out2(){
System.out.println(in.address);//访问内部类的非静态变量
}
public static void out3(){
System.out.println("外部类的静态方法");
}
public static void main(String[] agrs){
Inner.print();//在内部类中访问了外部类的静态成员变量,输出123
Inner.print1();//在内部类中调用外部类的方法
Person.out();//外部类中调用内部类的静态成员变量,输出175
Person p = new Person();
p.out2();//外部类中调用内部类的非静态成员变量,输出shanghai
}
}