学Java第三十六天--------内部类
一、什么是内部类
为什么要学习内部类
简单代码示例
二、匿名类-----内部类的一种
1、成员内部类
如何创建成员内部类对象
outer.this相当于外部类对象的地址,所以访问外部类的成员变量a时,就可以这样写:Outer.this.a
访问内部类的成员变量时,就可以写:this.a
2、总结
2、静态内部类
静态内部类可以想象成成员内部类是静态的。在一个类里面,用静态static修饰的变量、内部类等,在测试类中被调用的时候,要用类名去调用,不用对象名。内部类类名是 Outer.Inner,所以创建内部类对象时就可以:Outer.Inner oi =new Outer.Inner()。show1()是非静态方法,用对象名去调用:oi.show1();show2()是静态方法,用类名去调用:Outer.Inner.show2()。
静态内部类只能访问外部类的静态成员变量和静态成员方法,不能访问非静态的,如果要访问非静态的,就要先创建外部类的对象。如:
而且,不光是静态内部类只能访问静态变量,静态方法,连一个普通类的静态方法也只能访问静态变量,如下图所示。所以说:1、静态的只能访问静态变量 2、静态的东西在被调用的时候要用类名,不用对象名。
总结
3、局部内部类
private 、protected、public这些表示范围大小的修饰词只能修饰成员变量(在类里面),不能修饰局部变量(在一个方法里面)。
代码示例:
4、匿名内部类(重点掌握)
格式、概念、使用场景
代码示例:
1、先写一个接口---swim
package com.innerclass.demo3;public interface Swim {public abstract void swim();
}
2、写一个测试类,体现匿名内部类的用处
package com.innerclass.demo3;public class Test {public static void main(String[] args) {method(new Swim(){@Overridepublic void swim() {System.out.println("狗在狗刨");}});}public static void method(Swim s){//用Swim s接住,可以理解为多态,一个实现了该接口的类可以被接口类型接住s.swim();}
}
这样就不用再单独创建一个子类,再创建一个子类对象,来调用这个函数。
并不是匿名内部类,而是匿名内部类的对象。