一、先上一段代码:
package cn.it.staticDemo;
/**
* @author ligw
* @description: 静态和非静态
* @date 2020/2/28 11:18
*/
public class StaticDemo {
//在外部类定义静态成员和非静态成员
private static String name = "外部静态私有成员";
private String num = "外部非静态私有成员";
//静态内部类可以用 public,protected,private 修饰
static class Person{
//静态内部类中可以定义静态或者非静态的成员
private static String x="内部静态私有成员";
private String address = "内部非静态私有成员";
//内部类可以定义公有成员
public String mail = "内部非静态公有成员";
public void display(){
//静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
//System.out.println(num);//这是错误的
//静态内部类能访问外部类的静态成员(包括静态变量和静态方法)
System.out.println(name);//这是正确的
//内部类可以访问本内部类成员(静态或者非静态的成员)。
System.out.println("Inner:" + address+"x:"+x);
}
}
//非静态内部类
class People{
// private static String ss;//这是错误的,非静态内部类不能定义静态成员
public void test(){
//非静态内部类可以访问外部类成员
System.out.println(num);
System.out.println(name);
//非静态内部类不可以访问外部类的静态内部类成员
//System.out.println(x);
//System.out.println(address);
//System.out.println(mail);
}
}
public void printInfo(){
System.out.println(name);//可以直接访问外部类的静态成员
System.out.println(num);//可以直接访问外部类的非静态成员
//外部类不能直接访问内部类的成员(静态和非静态的成员)
//System.out.println(mail);//不可以直接访问内部类的公有成员
//System.out.println(address);//不可以直接访问内部类的非静态成员
//System.out.println(x);//不可以直接访问内部类的静态成员
//外部类要访问内部类的成员(静态和非静态的成员),只能通过实例化内部类调用访问
Person person = new Person();
person.display();
System.out.println(person.address);//可以访问内部类的私有成员
System.out.println(Person.x);// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(person.mail);//可以访问内部类的公有成员
}
public static void main(String[] args){
StaticDemo staticDemo = new StaticDemo();
staticDemo.printInfo();
//这样调用非静态内部类的方法
People people=new StaticDemo().new People();
people.test();
}
}
二、上面代码的输出为:
外部静态私有成员
外部非静态私有成员
外部静态私有成员
Inner:内部非静态私有成员x:内部静态私有成员
内部非静态私有成员
内部静态私有成员
内部非静态公有成员
外部非静态私有成员
外部静态私有成员
三、综上所得:
1、静态内部类可以用 public,protected,private 修饰
2、静态内部类不能访问外部类的非静态成员
3、静态内部类能访问外部类的静态成员
4、内部类可以访问本内部类成员
5、外部类可以直接访问外部类的成员
6、外部类不能直接访问内部类的成员
7、外部类要访问内部类的成员(静态和非静态的成员),只能通过实例化内部类调用访问
8、非静态内部类不能定义静态成员
9、非静态内部类可以访问外部类成员
10、非静态内部类不可以访问外部类的静态内部类成员,同时,静态内部类也不可以访问外部类的非静态内部类成员
注意:成员即是变量和方法