----------------------android培训、java培训、期待与您交流! ----------------------
现在简单总结一下java中的内部类。
java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。
很好理解,内部类在成员位置就是成员内部类,在方法内部就是方法内部类,没有名字的内部就是匿名内部类,被static关键字修饰的内部类叫做静态内部类。
内部类的共性:
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。
1.成员内部类:
最简单的一个成员内部类
class Outer {
class Inner{}
}
位置: 在成员位置 在类中方法外| 内部类可以直接访问外部类中的成员,包含私有成员
| 外部类想要访问内部类的成员,必须要创建内部类对象
| 案例:
class Outer {
private int num = 10;
class Inner{
public void show(){
Systetm.out.println(num);
}
}
}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
(成员内部类的修饰符)
| private : 为了提高数据的安全性
| static : 为了方便方法的调用
2.局部内部类
内部类(局部内部类)
| 位置: 在局部位置,在方法内
| 案例:
class Outer{
public void method(){
class Inner{
public void show(){
System.out.println("哈哈");
}
}
Inner in = new Inner();
in.show();
}
}
也就是和变量是同样的道理的,在什么位置就是什么,同理,局部内部类的有效范围也是和局部变量是相同的。
3.匿名内部类
内部类(匿名内部类)
| 就是没有名字的内部类
| 位置: 在局部位置
| 前提: 需要集成一个类或者实现一个接口
| 格式:
new 父类\接口 (){
重写父类或接口中的抽象方法
还可以写特有方法
};
| 案例:
interface Inter{
public abstract void show();
}
class Outer{
public void method(){
//局部位置
//匿名内部类
new Inter(){
public void show(){
System.out.println("哈哈");
}
};
}
}
匿名内部类不能定义任何静态成员、静态方法
匿名内部类不能是public,protected,private,static。
public class Car {
public void drive(){
System.out.println("Driving a car!");
}
public static void main(String[] args) {
Car car = new Car(){
public void drive() {
System.out.println("Driving another car!");
}
};
car.drive();
}
}
结果输出了:Driving another car! Car引用变量,不是引用Car对象,而是Car匿名子类的对象。
interface Vehicle {
public void drive();
}
class Test{
public static void main(String[] args) {
Vehicle v = new Vehicle(){
public void drive(){
System.out.println("Driving a car!");
}
};
v.drive();
}
}
class Bar{
void doStuff(Foo f){
f.foo();
}
}
interface Foo{
void foo();
}
class Test{
static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foofy");
}
});
}
}
4.静态内部类
可以定义静态或者非静态的成员。
class Outer{
static class Inner{}
}
class Test {
public static void main(String[] args){
Outer.Inner n = new Outer.Inner();
}
}
为什么需要内部类
//匿名内部类的方法调用
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
//----
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
//匿名内部类的方法调用
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
//----
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
//匿名内部类的特有方法调用
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
public void function(){
System.out.println("function");
}
}.function();
/*
发现每一次调用方法 都需要重新定义匿名内部类,麻烦,怎么解决该问题呢?
通过观察发现,new Inter() 相当于创建了一个父类或实现接口的子类对象。
可以将子类对象 赋值给 父类的引用 (多态)
*/
Inter inter = new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
};
inter.show();
inter.show2();
}
}
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show();
//----
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
}.show2();
//匿名内部类的特有方法调用
new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
public void function(){
System.out.println("function");
}
}.function();
/*
发现每一次调用方法 都需要重新定义匿名内部类,麻烦,怎么解决该问题呢?
通过观察发现,new Inter() 相当于创建了一个父类或实现接口的子类对象。
可以将子类对象 赋值给 父类的引用 (多态)
*/
Inter inter = new Inter(){
public void show(){
System.out.println("show");
}
public void show2(){
System.out.println("show2");
}
};
inter.show();
inter.show2();
}
}
class InnerClassDemo5
{
public static void main(String[] args)
{
Outer ou = new Outer();
ou.method();
}
}
----------------------android培训、java培训、期待与您交流! ----------------------