内部类:
将一个类定义在另一个类里面对里面的那个类就称为内部类(内置类,嵌套类);
访问特点:
内部类可以直接访问外部类中的成员,包括私有成员。
而外部类要访问内部类中的成员必须要建立内部类的对象。
外部类访问内部类要创建实例
直接创建内部类实例 Out.Inner in = out.new Inner();
静态内部类创建实例的写法 Out.Inner in = new Outer.Inner();
静态内部类只能反问静态的外部成员变量
将内部类写在方法中:外部函数的参数要加find才被内部的类访问和调用。
案例:
class InnerDemo
{
public static void main(String[] args)
{
new Outer().getInner().print();
}
}
{
public static void main(String[] args)
{
new Outer().getInner().print();
}
}
class Outer
{
private String name = "haoren";
class Inner
{
public void print(){
System.out.println(name);
}
}
public Inner getInner(){
Inner in = new Inner();
return in;
}
}
{
private String name = "haoren";
class Inner
{
public void print(){
System.out.println(name);
}
}
public Inner getInner(){
Inner in = new Inner();
return in;
}
}
匿名内部类:
前提:内部类可以继承或实现一个外部类或者接口
格式为:new 外部类名或者接口名(){覆盖类或者接口中的代码,
(也可以自定义内容)}
简单理解:
就是建立一个带内容的外部类或者接口的子类的匿名对象。
就是内部类的简化写法。
内部类可以实现和继承。
class NoNameDemo
{
public static void main(String[] args)
{
Do d = new Do();
//d.print(new B());
d.print(new A(){public void test(){
System.out.println("haha");
}});
}
}
interface A
{
void test();
}
/*
class B implements A
{
public void test(){
System.out.println("hahah");
}
}
*/
class Do
{
public void print(A a){
a.test();
}
{
public static void main(String[] args)
{
Do d = new Do();
//d.print(new B());
d.print(new A(){public void test(){
System.out.println("haha");
}});
}
}
interface A
{
void test();
}
/*
class B implements A
{
public void test(){
System.out.println("hahah");
}
}
*/
class Do
{
public void print(A a){
a.test();
}
}
内部类的扩展:
接口里边可以定义内部接口和抽象类
抽象类也可以定义接口和抽象类