内部类
理解:一个类中再声明另外一个类
分类:
成员内部类
静态内部类
接口内部类
局部内部类
匿名内部类应用场景:
a. B类的对象只在A类中使用,并且B类对象使用到了A类所有的属性,就可以将B类作为A类的成员内部类
b. B类的对象只在A类中使用,并且B类对象使用到了A类静态的属性,就可以将B类作为A类的静态内部类
c. 抽象类的子类只创建一次对象,就没必要创建子类,直接使用匿名内部类(new 抽象类)以new对象的,接口也是不能new对象,new出来的匿名类内部类的对象类 - 接口的关系:
类 - 类:单继承
类 - 接口:多实现
接口 - 接口:多继承各内部类理解代码
5.1成员内部类package com.qf.outter_inner_02; import com.qf.outter_inner_02.Outter.Inner; public class Test01 { /** * 知识点:成员内部类 * * 需求:创建成员内部类的对象,并调用方法 * * 小结: * 1.创建成员内部类对象,必须先创建外部类对象,再创建内部类对象 * 2.成员内部类可以使用外部类所有的属性 */ public static void main(String[] args) { Inner inner = new Outter().new Inner(); inner.method(); } }
package com.qf.outter_inner_02; //外部类 public class Outter { private String str1 = "属性1"; String str2 = "属性2"; protected String str3 = "属性3"; public String str4 = "属性4"; final String str5 = "属性5"; static String str6 = "属性6"; static final String str7 = "属性7"; //成员内部类 class Inner{ String str1 = "成员内部类的属性"; public void method(){ System.out.println("成员内部类的方法"); System.out.println(str1);//this.str1 System.out.println(Outter.this.str1); System.out.println(str2);//Outter.this.str2 System.out.println(str3);//Outter.this.str3 System.out.println(str4);//Outter.this.str4 System.out.println(str5);//Outter.this.str5 System.out.println(str6);//Outter.str6 System.out.println(str7);//Outter.str7 } } }
5.2静态内部类
package com.qf.outter_inner_03; import com.qf.outter_inner_03.Outter.Inner; public class Test01 { /** * 知识点:静态内部类 * * 需求:创建静态内部类的对象,并调用方法 * * 小结: * 1.创建静态内部类对象,不用创建外部类对象 * 2.静态内部类只能使用外部类的静态属性 */ public static void main(String[] args) { Inner inner = new Outter.Inner(); inner.method(); } }
package com.qf.outter_inner_03; //外部类 public class Outter { static String str1 = "属性1"; static final String str2 = "属性2"; //静态内部类 static class Inner{ public void method(){ System.out.println("静态内部类的方法"); System.out.println(str1);//Outter.str6 System.out.println(str2);//Outter.str7 } } }
5.3接口内部类
package com.qf.outter_inner_04; import com.qf.outter_inner_04.Outter.Inner; public class Test01 { /** * 知识点:接口内部类 * * 需求:创建接口内部类的对象,并调用方法 * * 小结: * 1.接口内部类就是静态内部类 * 2.接口内部类默认使用public static修饰 */ public static void main(String[] args) { Inner inner = new Outter.Inner(); inner.method(); } }
package com.qf.outter_inner_04; //外部接口 public interface Outter { //接口内部类 //public static class Inner{ class Inner{ public void method(){ System.out.println("接口内部类的方法"); } } }
5.4局部内部类
package com.qf.outter_inner_05; public class Test01 { /** * 知识点:局部内部类 * * 需求:调用局部内部类里的方法 * * 小结: * 局部内部类不能使用访问修饰符修饰(因为局部内部类的作用域就是在该方法内) */ public static void main(String[] args) { Outter outter = new Outter(); outter.method(); } }
package com.qf.outter_inner_05; //外部类 public class Outter { public void method(){ //局部内部类 class Inner{ public void innerMethod(){ System.out.println("局部内部类里的方法"); } } //创建局部内部类对象 Inner inner = new Inner(); inner.innerMethod(); } }
5.5匿名内部类(在抽象类中)