java基础 外部类、内部类

本文深入探讨Java中静态(static)与非静态成员的区别,包括它们的存储位置、生命周期及访问方式。通过具体代码示例,阐述静态方法、变量与非静态内部类的特点,以及它们如何影响类的结构和对象的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:成员方法被调用是压栈,成员变量随着对象的建立而存在于堆内存中。

类变量随着类的加载存在于共享区中(即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);

    }

}

参考:https://www.cnblogs.com/ibelieve618/p/6395532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值