Java内部类总结(下)

来源:互联网 发布:京东程序员工资待遇 编辑:程序博客网 时间:2024/05/24 02:53
五、匿名类
 
匿名类不给出类名,直接定义一个类,通常这个类实现了某种接口或者抽象。


interface Foo {void say();}public class lzwCode {    public Foo f = new Foo(){public void say() {System.out.println("Say Foo!");}};public Foo test() {return new Foo(){public void say() {System.out.println("Test Say Foo!");}};}public static void main(String [] args) {lzwCode lc = new lzwCode();lc.f.say();lc.test().say();}}

控制台结果:

//经典实例,来自thining in java,有改动interface Service {void mothodA();void mothodB();}interface ServiceFactory{Service getService();}//1class ImplementsActionA implements Service {private ImplementsActionA() {}public void mothodA() {System.out.println("ImplementsActionA 实现 mothodA()方法");}public void mothodB() {System.out.println("ImplementsActionA 实现 mothodB()方法");}public static ServiceFactory factory = new ServiceFactory(){public Service getService() {return new ImplementsActionA();}};}//2class ImplementsActionB implements Service {private ImplementsActionB() {}public void mothodA() {System.out.println("ImplementsActionB 实现 mothodA()方法");}public void mothodB() {System.out.println("ImplementsActionB 实现 mothodB()方法");}public static ServiceFactory factory = new ServiceFactory(){public Service getService() {return new ImplementsActionB();}};}//工厂public class lzwCode {    public static void serviceConsumer(ServiceFactory face) {Service ser = face.getService();ser.mothodA();ser.mothodB();}public static void main(String [] args) {serviceConsumer(ImplementsActionA.factory);serviceConsumer(ImplementsActionB.factory);}}
控制台结果:

六、静态内部类
 
静态内部类是static class型的内部类,这种内部类特点是:它不能访问外部类的非静态成员。要创建静态内部类对象时候,也不需要外部类对象了,直接可以:
new 外部类名.内部类构造方法

class Outer {public static int i = 404;protected static class Inner {int i = 110;String name;Inner(String name) {this.name = name;}void sayHello() {System.out.println("Hello "+name);Outer.i++;this.i++;}}public Inner getInner(String name) {return new Inner(name);}}public class lzwCode {   public static void main(String [] args) {Outer.Inner inn = new Outer.Inner("梅西");inn.sayHello();System.out.println(Outer.i);System.out.println(inn.i);}}

控制台结果:


七、接口内部类
 
接口内部类自动都是public static的,相当于为接口定义了一种变量类型,这在java的设计中就有使用,比如在HashMap中,就有:
static class Entry<K,V> implements Map.Entry<K,V>

interface InterInner {void sayHello();class Inner implements InterInner {public void sayHello() {System.out.println("这是一个接口内部类");}}}public class lzwCode {   public static void main(String [] args) {InterInner.Inner demo = new InterInner.Inner();demo.sayHello();}}

控制台结果:

这是一个接口内部类



八、内部类的继承
 
内部类的继承,可以继承内部类,也可以继承外部类。

class Outer {public void OuterMothod() {System.out.println("outer mothod!");}class Inner {public void sayHello() {System.out.println("Hello Barcelona");}}class InnerA extends Outer{public void OuterMothod() {System.out.println("InnerA mothod!");}public void readMe() {System.out.println("InnerA O(∩_∩)O");}}class InnerB extends Inner {public void sayHello() {System.out.println("InnerB Hello Barcelona");}public void readYou() {System.out.println("InnerB O(∩_∩)O");}}}public class lzwCode {   public static void main(String [] args) {Outer outer = new Outer(); Outer.Inner inn = outer.new Inner();inn.sayHello();        System.out.println("==========1===========");Outer.InnerA innA = outer.new InnerA();innA.OuterMothod();innA.readMe();System.out.println("==========2===========");Outer.InnerB innB = outer.new InnerB();innB.sayHello();innB.readYou();}}

控制台结果:


原创粉丝点击