说明:成员方法被调用是压栈,成员变量随着对象的建立而存在于堆内存中。
类变量随着类的加载存在于共享区中(即class加载完成后,static成员就在内存共享区中开辟了空间)。被static修饰的内容,就不在堆内存中了,而是存在于单独的方法区(也叫共享区或数据区)。
类变量生命周期最长,随着类的消失而消失;成员变量随着对象的消失而消失。
下面是例子:
package com.zm.shop.demo;
/**
* 内部类 外部类 静态内部类 非静态内部类
*
* 1、顶级类访问修饰符只能是 public(公共类)、final(不可继承类)、abstract(抽象类) 或者省略,不能是private、protected、static
* 2、静态方法只能访问静态资源、非静态方法可以访问所有静态和非静态资源;
* 3、静态内部类特点:不能访问外部类的成员变量和方法,能访问外部类的静态成员和方法; 静态内部类里面的成员方法里面是可以使用this的,指代该静态内部类;
* 4、静态内部类与非静态内部类的区别在于,静态内部类的对象是不指向与某个具体的外部类对象,所以在创建对象时不需要创建外部类对象,
* 并且在new的时候是通过 new OutClass2.StaticInnerClass()方式,而不是outClass.new StaticInnerClass()。这点和非静态内部类的实例化不太一样。
* @author 张梦
*/
public class OutClass2 {
//静态属性
private static String msg = "this is static 属性";
//非静态属性
private String msg2 = "this is non-static 属性";
//静态方法
public static void print0() {
print1();
System.out.println("我是外部类的静态方法"+"msg2"+msg);
}
//静态方法
public static void print1() {
print0();
System.out.println("我是外部类的静态方法");
}
//非静态方法
public void print3() {
print0();
print4();
System.out.println("我是外部类的非静态方法"+msg+msg2);
}
//非静态方法
public void print4() {
print0();
print4();
System.out.println("我是外部类的非静态方法");
}
//静态内部类 不能访问外部类的非静态属性和方法
public static class StaticInnerClass {
public void show1() {
System.out.println("静态类里面的this指向的是:"+this.getClass());
System.out.println("this is static class "+"访问静态属性:"+msg+"访问非静态属性"+"msg2");
}
public void show2() {
this.show1();
System.out.println("this is static class "+"访问静态属性:"+msg+"访问非静态属性"+"msg2");
}
public static void show3() {
System.out.println("this is static class "+"访问静态属性:"+msg+"访问非静态属性"+"msg2");
}
}
//非静态内部类
public class InnerClass{
public void show2() {
System.out.println("this is non-static class"+"访问静态属性:"+msg+"访问非静态属性"+msg2);
}
}
public static void main(String[] args) {
//创建一个静态内部类 类对象有两种方式OutClass2.StaticInnerClass.class 或者StaticInnerClass.class
StaticInnerClass staticInnerClass = new OutClass2.StaticInnerClass();
staticInnerClass.show1();
//创建一个非静态内部类 类对象有两种方式 OutClass2.InnerClass.class 或者 InnerClass.class
OutClass2 out = new OutClass2();
InnerClass innerClass = out.new InnerClass();
System.out.println("查询非静态内部类的class类型:"+ OutClass2.InnerClass.class);
System.out.println("查询非静态内部类的class类型:"+ InnerClass.class);
System.out.println("查询静态内部类的class类型:"+ OutClass2.StaticInnerClass.class);
System.out.println("查询静态内部类的class类型:"+StaticInnerClass.class);
System.out.println("查询外部类的类型:"+ OutClass2.class);
}
}