成员内部类:
/*
* A:内部类概述
类中的类
* B:内部类访问特点
* a:内部类可以直接访问外部类的成员,包括私有。
* b:外部类要访问内部类的成员,必须创建对象。
* 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
*/
(1)如何调用内部类方法
class Demo1_InnerClass { public static void main(String[] args) { //外部类名.内部类名 对象名 = 外部类对象.内部类对象; Outer.Inner oi = new Outer().new Inner(); oi.method(); } } class Outer { public int num = 10; private int a = 20; //注意内部类的位置和外部类成员变量的位置并列,可联想怎么调用外部类成员变量来调用内部类 class Inner { public void method() { System.out.println(num); System.out.println(a); } } }
(2)若内部类私有,(其实和外部类成员变量私有一回事儿,只需在本类中提供公共方法即可。)
eg.
class Demo2_InnerClass { public static void main(String[] args) { Outer o = new Outer(); o.print(); } } class Outer { private int num = 10; private class Inner { public void method() { System.out.println(num); } } public void print() { Inner i = new Inner(); i.method(); } }
静态内部类:
(1)如何调用静态内部类方法呢?
外部类名.内部类名 对象名 = 外部类名.内部类对象;
Outer.Inner oi = new Outer.Inner();
如果内部类方法为静态,可直接通过类名调用
eg.
class Demo1_InnerClass { public static void main(String[] args) { //外部类名.内部类名 对象名 = 外部类名.内部类对象; Outer.Inner oi = new Outer.Inner(); oi.method(); //调用静态内部类中的静态方法,通过类名调用。 Outer.Inner2.method(); } } class Outer { static int num = 10; static class Inner { public void method() { System.out.println("Hello World"); } } static class Inner2 { public static void method() { System.out.println("static Hello World"); } } }
(2)如何调用成员变量
eg. 要求:使用已知的变量,在控制台输出30,20,10。
class Test1_InnerClass { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } } class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num); //System.out.println(Inner.this.num); //所属类Inner可以省略 System.out.println(this.num); System.out.println(Outer.this.num); } } }
复习一下,this关键字调用本类的成员变量。
局部内部类
如何调用局部内部类方法?
eg
class Demo1_InnerClass { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } //局部内部类 class Outer { public void method() { class Inner { public void print() { System.out.println("Hello World"); } } Inner i = new Inner(); i.print(); } }
在外部类的方法(method())里面创建内部类对象后,直接在主方法里创建外部类对象调用method()即可。
匿名内部类
匿名内部类(局部内部类的一种),前提存在一个类或者接口(匿名内部类必须和类或者接口产生关系),这里的类可以是具体类,也可以是抽象类。
格式:
new 类名或者接口名(){
重写方法;
}; //注意分号
使用场景:(1)只创建某类的一个对象(2)只是用一次(3)只针对重写一个方法时使用
eg不使用匿名内部类:
class Demo1_InnerClass { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } interface Inter{ public void print();//abstract可以省略 } class Outer{ class Inner implements Inter{ public void print() { System.out.println("Hello World"); } } public void method(){ Inner i = new Inner(); i.print(); //等价于下面的代码,通过匿名对象调用方法。 //new Inner().print(); } }
eg使用匿名内部类:
class Demo1_InnerClass { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } interface Inter{ public void print();//abstract可以省略 } class Outer { public void method() { new Inter() { //代表实现了Inter接口,等同于是Inter的子类对象 public void print() { System.out.println("Hello word!"); } }.print(); } }
敬请指正.........