难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.内部类访问外部类中的实例变量
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义实例变量。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的实例变量,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类实例变量,从运行结果来看,完全没有问题。同样的我们可不可以在外界创建内部类对象,然后通过内部类Inner对象成员访问外部类实例变量呢?来看看吧:
Outer类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(12, 64) java: 找不到符号 符号: 变量 anInt 位置: 类型为lab.Outer.Inner的变量 innerError:(13, 65) java: 找不到符号 符号: 变量 aFloat 位置: 类型为lab.Outer.Inner的变量 innerError:(14, 66) java: 找不到符号 符号: 变量 aDouble 位置: 类型为lab.Outer.Inner的变量 innerError:(15, 62) java: 找不到符号 符号: 变量 str 位置: 类型为lab.Outer.Inner的变量 inner
内部类对象在外界是无法访问外部类实例变量,因为这些实例变量根本就不是定义在内部类中。要想访问这些实例变量,除非在内部类中提供获取外部类这些实例变量的非私有方法。例如:
Outer类:
Main类:
结果:
我们可以通过内部类暴露的接口来间接获取到它外部类的一些私有成员,这种操作日后也会非常常见。像本例中,外部类Outer中有一些私有的成员,也没提供获取的方法,但是我们内部类Inner中就提供了访问外部类Outer私有成员的方法,这样让我们不通过外部类,通过它里面的内部类也能获取到私有成员。
注意:
外部类实例变量内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。
外部类常量内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
外部类类变量内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
外部类静态常量内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
为什么要说上面这些提示,因为后面直接演示外界内部类对象怎么获取到外部类中实例变量、常量、类变量、静态常量。
2.内部类访问外部类中的实例方法
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义实例方法。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的实例方法,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类实例方法,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类实例方法,所以在内部类中提供了访问外部类实例方法的方法。
注意:
外部类实例方法内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。
外部类最终方法内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
外部类类方法内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
外部类静态最终方法内部类对象也无法直接获取,也只能通过提供一些非私有的方法间接获取。
为什么要说上面这些提示,因为后面直接演示外界内部类对象怎么获取到外部类中实例方法、最终方法、类方法、静态最终方法。
3.内部类访问外部类中的常量
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义变量。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的常量,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类常量,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类常量,所以在内部类中提供了访问外部类常量的方法。
4.外部类访问内部类中的最终方法
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义最终方法。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的最终方法,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类最终方法,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类最终方法,所以在内部类中提供了访问外部类最终方法的方法。
5.内部类访问外部类中的类变量
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义类变量。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的类变量,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类类变量,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类类变量,所以在内部类中提供了访问外部类类变量的方法。
6.外部类访问内部类中的类方法
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义类方法。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的类方法,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类类方法,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类类方法,所以在内部类中提供了访问外部类类方法的方法。
7.外部类访问内部类中的静态常量
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义静态常量。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的静态常量,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类静态常量,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类静态常量,所以在内部类中提供了访问外部类静态常量的方法。
8.外部类访问内部类中的静态最终方法
演示:
请创建一个外部类Outer,在外部类Outer里面创建一个内部类Inner。在内部类Inner中定义静态最终方法。试试用外部类访问内部类成员。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
我们在外部类Outer中定义了四种不同访问权限的静态最终方法,访问权限分别为private,public,protected或package private。在内部类Inner构造方法中我们访问了这些外部类静态最终方法,从运行结果来看,完全没有问题。
因为在外界内部类对象无法直接访问外部类静态最终方法,所以在内部类中提供了访问外部类静态最终方法的方法。
总结
- 在Java中,我们可以在一个类中再定义一个类,这样称之为内部类。
- 内部类又称之为嵌套类。
- 内部类分为两类:静态和非静态。 声明为static的内部类称为静态内部类。 非静态内部类称为内部类。
- 要实例化内部类,必须首先实例化外部类。
- 内部类中的实例变量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
- 内部类中的实例方法。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
- 内部类中的常量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
- 内部类中的最终方法。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
- 内部类中的类变量。内部类不可以定义任何类变量。
- 内部类中的类方法。内部类不可以定义任何类方法。
- 内部类中的静态常量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
- 内部类中的静态最终方法。内部类不可以定义任何静态最终方法。
- 内部类访问外部类中的实例变量、实例方法、常量、最终方法、类变量、类方法、静态常量、静态最终方法,可以通过内部类内部访问,外界内部类对象只能通过提供的非私有方法访问。
至此,Java中内部类访问外部类成员相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第六十八章:外部类访问内部类成员详解
下一章
“全栈2019”Java第七十章:静态内部类详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!