装饰网站banner,广告推广公司,江苏网站建设案例,济南网站优化收费标准内部类
把类定义在其他类的内部,这个类就叫内部类。 内部类分为:成员内部类、局部内部类。
内部类访问特点: 内部类可以直接访问外部类的成员,包括私有。 外部类访问内部类的成员,必须创建对象。
局部内部类
局部内…
内部类
把类定义在其他类的内部,这个类就叫内部类。
内部类分为:成员内部类、局部内部类。
内部类访问特点:
内部类可以直接访问外部类的成员,包括私有。
外部类访问内部类的成员,必须创建对象。
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类。
public class Outer {public void function() {//局部内部类Innerclass Inner {public void print() {System.out.println("局部内部类");}}//在局部位置创建内部类对象,调内部类方法,来使用局部内部类功能Inner in= new Inner();in.print();}
}
public class InnerDemo {public static void main(String[] args){Outer out= new Outer();out.function();}
}//输出:局部内部类
什么时候使用局部内部类:
假设Inner这个类只在方法function中创建这个类对象时被使用了一次。(即只在某个方法中需要用那么一下)
当遇到这种情况时,可以在一个方法中定义局部类。
匿名内部类
匿名内部类将局部内部类的使用再深入一步。假如只创建这个类的一个对象,就不必命名了。
前提:存在一个类(抽象类或具体类都可以)或者接口。
格式:
new 类名或者接口名(){重写方法;
};//有个分号哦,这句其实是一个对象
匿名内部类的本质:
是一个继承了类或者实现了接口的子类匿名对象。
接口式匿名内部类:
code V1:
//接口
interface Inter {public abstract void show();
}
//采用匿名内部类实现接口
public class OuterInner {public void method(){new Inter(){public void show(){System.out.println("我是匿名内部类");}}.show(); //Note!!分号 这句是一个匿名对象 它实现了Inner接口(重写了show方法) 它是一个实现了接口的子类匿名对象,对象调方法}
}
//测试类
public class AnonymousInnerDemo {public static void main(String[] args){OuterInner o= new OuterInner();o.method();}
}//输出结果:我是匿名内部类
code V2:
//采用匿名内部类实现接口 V2
public class OuterInner {public void method(){Inter i= new Inter(){ //其实是多态Fu f= new Zi(); 右边new Inter(){}这一堆是子public void show(){System.out.println("我是匿名内部类");}};//注意分号哦i.show();}}
匿名内部类在开发中的使用
- 参数式的匿名内部类:使用比较器排序的TreeSet、TreeMap
https://blog.csdn.net/u013317445/article/details/82228746 TreeMap比较器排序中用到。采用了匿名内部类重写Comparator的compare方法,也就是实现Comparator接口。
interface Person {public abstract void study();
}
public class PersonDemo {//method的形参是个接口//需要的实参是一个该接口的实现类对象 其实我们在给实参时,就可以用匿名内部类public void method(Person p){p.study();}
}
public class AnonymousInnerDemo {public static void main(String[] args){PersonDemo pd= new PersonDemo();//整个操作中只使用一次,且只需要创建一个实例,就可以将其定义为匿名内部类//参数式匿名内部类//最原始的方式是单独写一个类实现Person接口,在这个类中重写方法。然后创建该类的对象,然后调用方法pd.method(new Person() {@Overridepublic void study() {System.out.println("好好学习");}});}
}
一道题引发的思考
interface Inter{void show();
}class Outer{//补齐该类的代码 令测试类输出为HelloWorld.public static Inter method(){return new Inter(){ //return了一个这样的匿名对象@Overridepublic void show(){System.out.println("HelloWorld.");}};}
}public class Prictice {public static void main(String[] args){Outer.method().show();//Outer.method():类调用方法,说明method是static的//.show():说明点前面有对象——>method有返回值,且返回值为一个对象,且这个对象的类型里面定义了show方法}
}
Outer.method().show(); 这一句代码:
Outer.method():类调用方法,说明method是static的
.show():说明点前面有对象——>method有返回值,且返回值为一个对象,且这个对象的类型里面定义了show方法