专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 让我们来加深非静态内部类的知识点

让我们来加深非静态内部类的知识点

更新时间:2023-02-10 16:51:19 来源:动力节点 浏览803次

在Java 内部类的学习中,你会发现关于静态内部类和非静态内部类方法和属性调用的规则有好多,为了加深理解记忆,在这里总结一下,如有错误欢迎指正。

内部类实质上可以理解为外部类的一个成员,作为一个类,它可以有访问修饰符修饰,因为内部类的上一级程序单元是外部类,所以它具有4个作用域:同一个类,同一个包,父子类和任意位置,因此可以使用private、protected、public、default修饰符修饰。作为一个成员,它可以用static修饰,所以分为普通内部类和静态内部类。

一、非静态内部类 :

非静态内部类因为是非静态成员所以是依赖对象而存在的,所以要想创建非静态内部类的对象,必须先要有外部类对象才行,但是如果已经有了外部类的对象,却不代表一定有非静态内部类对象的产生。所以可以想到:

1、当创建非静态内部类对象的时候就相当于外部类的不管是实例变量,还是类变量都可以直接使用了,然后根据内部类本身就属于外部类本身,所以不管公有属性还是私有属性都可以使用。

2、由于在非静态内部类一般是没有静态成员的(因为有一个特殊的例子就是编译器常量,也就是在编译期就能确定值的常量,在上篇博文中有详细介绍),所以上面说到的调用都是在非静态内部类的普通方法里调用的。

3、根据静态成员不能引用非静态成员的规则,外部类的静态成员也不能访问非静态内部类。包括不能使用非静态内部类定义变量、创建实例等。所以只能在外部类的非静态方法里面创建的实例,在静态方法里面创建实例就会报错。

public class Out {
	public String str1="公有普通变量";
	private String str2="私有普通变量";
	public static String str3="公有静态变量";
	private static String str4="私有静态变量";

	public void test1() {
    	System.out.println("外部类的普通公有方法!");
    }
	private void test2() {
		System.out.println("外部类的普通私有方法");
	}
    public static void test3() {
    	System.out.println("外部类的静态公有方法!");
    }
    private static void test4() {
		System.out.println("外部类的静态私有方法");

	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
       new Out().getInner();
	}
	 class Inner{
		public final static int a=3;    //编译期常量,不会报错
		public void test() {
			test1();   //外部类的普通公有方法!
			test2();   //外部类的普通私有方法!
			test3();   //外部类的静态公有方法!
			test4();   //外部类的静态私有方法!
                        //下面这行代码分别输出str1、str2、str3、str4
			System.out.println(str1+"\t"+str2+"\t"+str3+"\t"+str4);
		}

	}
	public void getInner() {
		Inner inner=new Inner();
		inner.test();
	}

        public static void getInner2() {
		//下面这行代码会报错,因为不能在静态成员里面引用非静态内部类
		//Inner inner=new Inner();

	}


}

以上就是动力节点小编介绍的"让我们来加深非静态内部类的知识点",希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为您务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>