---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
内部类:
如果A类需要直接访问B类中的成员,而B类又要建立A类的对象。为了方便设计和访问,直接将A类定义在B类中。A 类就称为内部类。内部类可以直接访问外部类的成员。而外部类想要访问内部类,必须要建立内部类的对象。
内部类定义在外部类中的成员位置上,可以用一些成员修饰符private,static
1. 默认修饰符
直接访问内部格式: 外部类名.内部类名 变量名 = 外部类对象.内部类对象;
Outer.Inner in = new Outer.new Inner();
2.私有修饰符
通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。
3.静态修饰符
如果内部类被静态修饰,相当于内部类,会出现访问局限性,只能访问外部类中的静态成员。
注意:如果内部类中定义了静态成员,那么该内部类必须是静态的。
内部类编译后的文件名:“外部类名$内部类名.java”
内部类
(1)Def:把类定义在另一个类的内部,对里面那个类就称为内部类(内置类,嵌套类);
(2)
访问特点:
A:内部类可以直接访问外部类成员,包括私有
B:外部类要想访问内部类成员,必须创建对象。
(3)分类
a:成员内部类
b:局部内部类
成员内部类:
内部类被private修饰,能被外部类新建对象访问。不能被外界访问。
static 为了方便,用类名调用
private例子:
class Outer
{
private class Inner
{
}
}
class Demo
{
public static void main(String [] args)
{
Outer.Inner i = new Outer().new Inner();//出错,外界不能访问被private修饰的内部类
}
}
static例子:
class Outer
{
private class Inner
{
}
static class Inner2
{
public void show()
{
}
public static void show2()
{
}
}
}
class Demo
{
public static void main(String [] args)
{
//Outer.Inner i = new Outer().new Inner();报错,内部类被静态修饰了,不能通过对象调用了,只能通过类名调用了,所以去了();
Outer.Inner2 i = new Outer.Inner2();
i.show();
i.show2();
Outer.Inner2.show2();
}
}
如果内部类是static修饰,格式: 外部类名.内部类名 变量 = new 外部类名.内部类名();
局部内部类:
只能在局部被创建对象,调用方法。
例子:
class Outer
{
private int num = 10;
public void method()
{
//定义类
class Inner
{
public void show()
{
System.out.println(num);
}
}
//创建对象
Inner i = new Inner();
i.show();
}
public void function()
{
//错误
//Inner i = new Inner();
//i.show();
}
}
class Demo
{
public static void main(String [] args)
{
Outer o = new Outer();
o.method();
}
}
局部内部类访问局部变量,该变量必须被final修饰;
为什么?
局部变量会在方法调用完毕后立马消失。
而局部内部类中如果有地方使用局部变量,当方法消失后
这个方法区中的内容还没有消失,也就是说这个变量还必须存在。
所以为了延长局部变量的生命周期,就加final修饰。
匿名内部类:
没有名字的局部内部类;
前提:
必须存在一个类,抽象类或者接口。
格式:
new 类名或者接口名()
{
重写类或者接口中的方法。
也可以自己重新定义。
};
理解:是一个继承了类或者实现了接口的匿名的子类对象。
什么时候使用匿名内部类:
一般来说,当接口或者抽象类中的方法在3个以下的时候,考虑使用。
以后看到一个方法接收的形式参数是一个抽象类或接口的时候,使用。
interface Inter
{
public abstract void show();
}
class Outer
{
public void method()
{
new Inter()
{
public void show()
{
System.out.println("show");
}
}.show();
//怎么调用呢?
}
}
class Demo
{
public static void main(String [] args)
{
Outer o = new Outer();
o.method();
}
}
用接口的 多态来调用
Inter i = new Inter()
{
public void show()
{
System.out.println("show");
}
};
i.show();
i.show2();
实例:
interface Animal
{
public abstract void eat();
}
class Dog implements Animal
{
public void eat()
{
System.out.println("eat dog");
}
}
class Test
{
public void show(Animal a)
{
a.eat();
}
}
class AnimalTest
{
public static void main(String [] args)
{
Test t = new Test();
Dog d = new Dog();
t.show(d);
}
}
---->
public static void main(String [] args)
{
Test t = new Test();
//Dog d = new Dog();
//t.show(d);
t.show(new Animal()
{
public void eat()
{
System.out.println("eat dog");
}
}
);
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>