首先讲一下类的五大成员:属性,方法,构造器,代码块,内部类。
内部类就是类中嵌套另外的类,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类中间的包含关系。
public class LocalInnerClass { public static void main(String[] args) { Outer outer = new Outer(); outer.m1(); } } class Outer { private int n = 1; public void m3() { System.out.println("这是m3()方法。"); } //在方法中或者代码块中写内部类。 public void m1() { final class Inner {//不能添加访问修饰符,可以使用final修饰。 public void m2() { System.out.println(n); m3(); } } //外部类在方法中,可以创建内部类对象,然后访问内部类的方法。 Inner inner = new Inner(); inner.m2(); } }
如果外部类和局部类有重名成员时,默认就近原则,如果想访问外部类的成员,则可以使用(外部类.this.成员)
public class LocalInnerClass { public static void main(String[] args) { Outer outer = new Outer(); outer.m1(); } } class Outer { private int n = 1;//外部类的n。 public void m3() { System.out.println("这是m3()方法。"); } //在方法中或者代码块中写内部类。 public void m1() { final class Inner {//不能添加访问修饰符,可以使用final修饰。 private int n=3;//内部类的n; public void m2() { System.out.println(n); System.out.println("外部类的n值是:"+Outer.this.n);//访问外部属性n。 m3(); } } //外部类在方法中可以创建内部类对象,然后访问内部类的方法。 Inner inner = new Inner(); inner.m2(); } }
定义:本质是类,定义在外部类的局部位置(方法或者代码块中。)
为什么要使用匿名内部类?
因为有些类只是用一次,后面不再使用,所以用匿名内部类简化开发。
基本语法:new 类或者接口{
类体
};
public class Anonymous { public static void main(String[] args) { Outer outer = new Outer(); outer.method(); } } class Outer { public void method() { //IB是编译类型,真正的的运行类型是匿名内部类Outer$1。 IB tiger = new IB() { @Override public void cry() { System.out.println("Tiger叫唤。"); } }; tiger.cry(); System.out.println(tiger.getClass());//class com.zj.AnonymousInnerClass.Outer$1,实际的匿名内部类类名,它是底层分配的,不显示。 } } interface IB{ void cry();
public class Anonymous02 { public static void main(String[] args) { Outer02 outer = new Outer02(); outer.method(); } } class Outer02{ public void method(){ Father father=new Father("张三"){ }; Mother mother=new Mother() { @Override public void hello() { System.out.println("我是Hello."); } }; mother.hello(); System.out.println(father.getClass()); } } class Father{ String name; public Father(String name){ this.name=name; System.out.println("名字是:"+this.name); } public void hi(){ } } abstract class Mother{ abstract public void hello(); } //名字是:张三 //class com.zj.AnonymousInnerClass.Outer02$1 //我是Hello.
public class AnonymousExercise02 { public static void main(String[] args) { CellPhone cellPhone = new CellPhone(); CellPhone cellPhone1 = new CellPhone(); cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("小猪起床了。"); } }); cellPhone1.alarmClock(new Bell() { @Override public void ring() { System.out.println("小可爱起床了。"); } }); } } interface Bell{ void ring(); } class CellPhone{ public void alarmClock(Bell bell){ System.out.println(bell.getClass()); bell.ring(); } } //class com.zj.AnonymousInnerClass.AnonymousExercise02$1 //小猪起床了。 //class com.zj.AnonymousInnerClass.AnonymousExercise02$2 //小可爱起床了。
public class MemberInnerClass { public static void main(String[] args) { Outer outer = new Outer(); outer.t1(); } } class Outer{ private int n=10; public String name="张三"; //成员内部类。 class Inner{ public void say(){ System.out.println("n="+n+",name="+name); } } public void t1(){ Inner inner = new Inner(); inner.say(); } }
1.外部类的对象.new 内部类(语法记住就行。)
public class MemberInnerClass { public static void main(String[] args) { Outer outer = new Outer(); outer.t1(); //外部其他类访问成员内部类。 Outer.Inner inner = outer.new Inner(); inner.say(); } } class Outer{ private int n=10; public String name="张三"; class Inner{ public void say(){ System.out.println("n="+n+",name="+name); } } public void t1(){ Inner inner = new Inner(); inner.say(); } }
2.写一个方法返回一个实例。
public class MemberInnerClass { public static void main(String[] args) { Outer.Inner instance = outer.getInstance(); instance.say(); } } class Outer{ private int n=10; public String name="张三"; class Inner{ public void say(){ System.out.println("n="+n+",name="+name); } } public Inner getInstance(){ return new Inner(); } }
使用static修饰。
可以直接访问所有静态成员,但是不能访问非静态成员。
可以添加任何访问修饰符。因为它的地位相当于一个成员。
外部类访问内部类的方式。直接创建一个方法然后new对象再调用静态内部类的方法。
外部类和内部类成员重名时,默认就近原则。如果想访问外部类的成员用 外部类.成员。
public class StaticInnerClass01 { public static void main(String[] args) { Outer outer = new Outer(); outer.hi(); } } class Outer{ private int n=11; private static String name="张三"; static class Inner{ public void say(){ System.out.println("name= "+name); } } public void hi(){ Inner inner = new Inner(); inner.say(); } }
public class StaticInnerClass01 { public static void main(String[] args) { Outer.Inner inner = new Outer.Inner(); inner.say(); } } class Outer{ private int n=11; private static String name="张三"; static class Inner{ public void say(){ System.out.println("name= "+name); } } }
写一个方法返回实例。
public class StaticInnerClass01 { public static void main(String[] args) { //外部类调用 Outer outer = new Outer(); Outer.Inner instance = outer.getInstance(); instance.say(); } } class Outer{ private int n=11; private static String name="张三"; static class Inner{ public void say(){ System.out.println("name= "+name); } } //定义一个实例方法。 public Inner getInstance(){ return new Inner(); } }