JavaSE---内部类
1、概述
1.1 内部类:一个类 定义在 其他类的内部,这个类被称为内部类;
内部类可以 放在 外部类 的任何位置;
1.2、语法
public class Test {
修饰符 class 内部类类名{
}
}
2、内部类访问特点
内部类 可以直接访问外部类的成员,包括私有
外部类 想访问内部类的成员,必须创建对象
3、根据内部类存放的位置,分为
成员内部类 :
package com.an.innerclass.memberinnerclass;
public class Outer {
private int age=18;
private static String name="jack";
String job="teacher";
public void say(){
System.out.println("Outer say...");
}
private MemberInnerClass memberInnerClass=null;
public MemberInnerClass getMemberInnerClass(){
if (null==memberInnerClass){
memberInnerClass=new MemberInnerClass();
}
return memberInnerClass;
}
/**
* 位置:作为外部类的成员
* 成员内部类 可以 访问 外部类的所有成员属性、成员方法(包括 private、static)
*
*/
public class MemberInnerClass{
void useOuter(){
System.out.println(age);
System.out.println(name);
System.out.println(job);
//如果 成员内部类 拥有的成员变量或方法 与 外部类同名时,默认访问的 是成员内部类的成员
say();
//如果 成员内部类 拥有的成员变量或方法 与 外部类同名时,要访问外部类成员,需要使用 外部类.this.成员方法|成员变量
Outer.this.say();
}
void say(){
System.out.println("MemberInnerClass say...");
}
}
}
class Test{
public static void main(String[] args) {
//外部类 访问 内部类 的成员 只能创建 内部类对象,再由 内部类对象 访问 内部类成员
//第一种方式:
Outer.MemberInnerClass memberInnerClass=new Outer().new MemberInnerClass();
memberInnerClass.useOuter();
//第二种方式:
Outer.MemberInnerClass memberInnerClass1=new Outer().getMemberInnerClass();
}
}
javac编译Outer.java
public class Outer {
private int age = 18;
private static String name = "jack";
String job = "teacher";
private Outer.MemberInnerClass memberInnerClass = null;
public Outer() {
}
public void say() {
System.out.println("Outer say...");
}
public Outer.MemberInnerClass getMemberInnerClass() {
if (null == this.memberInnerClass) {
this.memberInnerClass = new Outer.MemberInnerClass();
}
return this.memberInnerClass;
}
public class MemberInnerClass {
public MemberInnerClass() {
}
void useOuter() {
System.out.println(Outer.this.age);
System.out.println(Outer.name);
System.out.println(Outer.this.job);
this.say();
Outer.this.say();
}
void say() {
System.out.println("MemberInnerClass say...");
}
}
}
public class Outer$MemberInnerClass {
public Outer$MemberInnerClass(Outer var1) {
this.this$0 = var1;
}
void useOuter() {
System.out.println(Outer.access$000(this.this$0));
System.out.println(Outer.access$100());
System.out.println(this.this$0.job);
this.say();
this.this$0.say();
}
void say() {
System.out.println("MemberInnerClass say...");
}
}
class Test {
Test() {
}
public static void main(String[] var0) {
Outer var10002 = new Outer();
var10002.getClass();
MemberInnerClass var1 = new MemberInnerClass(var10002);
var1.useOuter();
MemberInnerClass var2 = (new Outer()).getMemberInnerClass();
}
}
局部内部类:
定义在方法中,仅在方法中有效;
不能使用任何修饰符,也不能用static修饰;
package com.an.innerclass.partinnerclass;
public class Outer {
private String name="jack";
private static int age=18;
public void say(){
/**
* 局部内部类 不能有 public、protected、private 以及 static 修饰符的
*
* 外部如何使用局部内部类 :
* 外部类对象.外部类成员方法.内部类对象.内部类成员方法
*/
class PartInnerClass{
public void show(){
System.out.println(name);
System.out.println(age);
}
}
new PartInnerClass().show();
}
}
class Test{
public static void main(String[] args) {
new Outer().say();
}
}
javac编译Outer.java
public class Outer {
private String name = "jack";
private static int age = 18;
public Outer() {
}
public void say() {
class PartInnerClass {
PartInnerClass() {
}
public void show() {
System.out.println(Outer.this.name);
System.out.println(Outer.age);
}
}
(new PartInnerClass()).show();
}
}
class Outer$1PartInnerClass {
Outer$1PartInnerClass(Outer var1) {
this.this$0 = var1;
}
public void show() {
System.out.println(Outer.access$000(this.this$0));
System.out.println(Outer.access$100());
}
}
class Test {
Test() {
}
public static void main(String[] var0) {
(new Outer()).say();
}
}
匿名内部类:
a, 只使用一次;
b, 语法:
new 父类构造器(实参) | 实现接口(){ }
c, 必须 继承一个父类(最多一个) 或 实现一个接口(最多一个);
d, 不能 定义构造器,但 可以有初始化块;
e, 不能 是抽象类;
package com.an.innerclass.nonameinnerclass;
public interface NonameInnerClass {
void say();
}
class Test{
public static void main(String[] args) {
/**
* 匿名内部类 不能有访问修饰符和 static 修饰符
*
* 位置:参数
*/
say(new NonameInnerClass() {
public void say() {
System.out.println("NonameInnerClass say...");
}
});
}
public static void say(NonameInnerClass nonameInnerClass){
nonameInnerClass.say();
}
}
javac编译Outer.java
public interface NonameInnerClass {
void say();
}
class Test {
Test() {
}
public static void main(String[] var0) {
say(new NonameInnerClass() {
public void say() {
System.out.println("NonameInnerClass say...");
}
});
}
public static void say(NonameInnerClass var0) {
var0.say();
}
}
final class Test$1 implements NonameInnerClass {
Test$1() {
}
public void say() {
System.out.println("NonameInnerClass say...");
}
}
匿名内部类 实质:
创建一个 实现接口的 类,重写方法;
静态内部类:
package com.an.innerclass.staticinnerclass;
public class Outer {
private String name="rose";
static String job="teacher";
/**
* 静态内部类 static修饰
* 不能访问外部类非static成员
*
* 不依赖于外部类对象,直接使用new Outer.StaticInnerClass()
*/
public static class StaticInnerClass{
public void say(){
System.out.println(job);
}
}
}
class Test{
public static void main(String[] args) {
Outer.StaticInnerClass staticInnerClass =new Outer.StaticInnerClass();
staticInnerClass.say();
}
}
javac编译Outer.java
public class Outer {
private String name = "rose";
static String job = "teacher";
public Outer() {
}
public static class StaticInnerClass {
public StaticInnerClass() {
}
public void say() {
System.out.println(Outer.job);
}
}
}
public class Outer$StaticInnerClass {
public Outer$StaticInnerClass() {
}
public void say() {
System.out.println(Outer.job);
}
}
class Test {
Test() {
}
public static void main(String[] var0) {
StaticInnerClass var1 = new StaticInnerClass();
var1.say();
}
}
静态内部类 不依赖 外部类;
4、使用内部类
a, 外部类 中使用 内部类
b, 外部类 以外使用 内部类
非静态内部类:
声明 变量: OuterClass.InnerClass 变量名 ;
实例化 : OuterInstance.new InnerConstructor() ;
Outer.MemberInnerClass memberInnerClass=new Outer().new MemberInnerClass();
public class Outer$MemberInnerClass {
public Outer$MemberInnerClass(Outer var1) {
this.this$0 = var1;
}
void useOuter() {
System.out.println(Outer.access$000(this.this$0));
System.out.println(Outer.access$100());
System.out.println(this.this$0.job);
this.say();
this.this$0.say();
}
void say() {
System.out.println("MemberInnerClass say...");
}
}
静态内部类:
声明 变量: OuterClass.InnerClass 变量名 ;
实例化 : new OuterClass.InnerConstructor() ;
Outer.StaticInnerClass staticInnerClass =new Outer.StaticInnerClass();
public class Outer$StaticInnerClass {
public Outer$StaticInnerClass() {
}
public void say() {
System.out.println(Outer.job);
}
}
浙公网安备 33010602011771号