java

位置:IT落伍者 >> java >> 浏览文章

浅析Java内部类在GUI设计中的作用(2)


发布日期:2019年02月08日
 
浅析Java内部类在GUI设计中的作用(2)

方法内部类

方法内部类只在该方法内部可见方法内部类可以定义在方法中的任何位置

/**

* 内部类实现接口

*

* @author leizhimin ::

*/

public class Test {

public static void main(String[] args) {

Outer outer = new Outer();

Foo f = outergenFoo();

Bar b = outergenBar();

fsay();

breadme();

}

}

class Outer {

public Foo genFoo() {

//方法内的内部类

class FooImpl implements Foo {

public void say() {

Systemoutprintln(say foo!);

}

}

return new FooImpl();

}

public Bar genBar() {

Bar b = null;

if (true) {

//任意位置的内部类

class BarImpl implements Bar {

public void readme() {

Systemoutprintln(say bar!);

}

}

b = new BarImpl();

}

return b;

}

}

运行结果

say foo!

say bar!

Process finished with exit code

匿名类

匿名类不给出类名直接定义一个类通常这个类实现了某种接口或者抽象匿名类的访问权限更没有讨论价值了看个例子就行了

在一些多线程程序中比较常见有点变态呵呵

/**

* 匿名类

*

* @author leizhimin ::

*/

public class Test {

public Foo f = new Foo() {

public void say() {

Systemoutprintln(O(∩_∩)O哈哈~!);

}

};

public Foo test() {

return new Foo() {

public void say() {

Systemoutprintln(say foo!);

}

};

}

public static void main(String[] args) {

Test t = new Test();

tfsay();

ttest()say();

}

}

interface Foo {

void say();

}

运行结果

say foo!

Process finished with exit code

/**

* 普通类的匿名初始化

*

* @author leizhimin ::

*/

public class Fk {

private String x;

public Fk(String x) {

thisx = x;

}

@Override

public String toString() {

return Fk{ +

x= + x + \ +

};

}

}

class Test {

public Fk hehe() {

//把后面的一对大括号去掉呢呵呵

return new Fk(fk) {

};

}

public static void main(String[] args) {

Test t = new Test();

Fk f = thehe();

Systemoutprintln(f);

}

}

运行结果

Fk{x=fk}

Process finished with exit code

还有一个不得不提的经典实例来自thining in java有改动

interface Service {

void method();

void method();

}

interface ServiceFactory {

Service getService();

}

class Implementation implements Service {

private Implementation() {}

public void method() {Systemoutprintln(Implementation method);}

public void method() {Systemoutprintln(Implementation method);}

public static ServiceFactory factory = new ServiceFactory() {

public Service getService() {

return new Implementation();

}

};

}

class Implementation implements Service {

private Implementation() {}

public void method() {Systemoutprintln(Implementation method);}

public void method() {Systemoutprintln(Implementation method);}

public static ServiceFactory factory = new ServiceFactory() {

public Service getService() {

return new Implementation();

}

};

}

public class Factories {

public static void serviceConsumer(ServiceFactory fact) {

Service s = factgetService();

thod();

thod();

}

public static void main(String[] args) {

serviceConsumer(Implementationfactory);

serviceConsumer(Implementationfactory);

}

}

这个应用给了我们很多思考我就不说了不同人看了会有不同的感受

内部类的巧妙使用会让你的代码很牛如果要形容下那就是没看懂的时候感觉神出鬼没看懂后感觉鬼斧神工不过这些代码多了别人想看懂都难想看懂你思路就难上加难了呵呵!

静态内部类

静态内部类是static class型的内部类这种内部类特点是它不能访问外部类的非静态成员要创建静态内部类对象时候也不需要外部类对象了直接可以

new 外部类名内部类构造方法

来创建给个例子

/**

* 静态内部类

*

* @author leizhimin ::

*/

public class Outer {

public static int i =;

protected static class Inner {

int i =;

String name;

Inner(String name) {

thisname = name;

}

void sayHello() {

Systemoutprintln(Hello + name);

Outeri++;

}

}

public Inner genInner(String name) {

return new Inner(name);

}

}

class Test {

public static void main(String[] args) {

OuterInner in = new OuterInner();

insayHello();

Systemoutprintln(Outeri);

OuterInner in = new Outer()genInner();

insayHello();

Systemoutprintln(Outeri);

}

}

运行结果

Hello

Hello

Process finished with exit code

接口内部类

接口内部类自动都是public static的相当于为接口定义了一种变量类型这在java的设计中就有使用比如在HashMap中就有

static class Entry implements MapEntry

下面我给个例子

/**

* 接口内部类

*

* @author leizhimin ::

*/

public interface AInterface {

void readme();

class Inner implements AInterface {

public void readme() {

Systemoutprintln(我是一个接口内部类);

}

}

}

class Main {

public static void main(String[] args) {

AInterfaceInner in = new AInterfaceInner();

inreadme();

}

}

内部的类的嵌套

所谓内部类嵌套就是内部类里面再定义内部类其实这种用法还真没见过试试写个简单例子看看吧

/**

* 嵌套内部类

*

* @author leizhimin ::

*/

public class Outer {

private void f() {

Systemoutprintln(f);

}

class A {

private void a() {

f();

Systemoutprintln(a);

}

class B {

protected void b() {

a();

Systemoutprintln(b);

}

}

}

}

class Test{

public static void main(String[] args) {

Outer o = new Outer();

OuterA a = onew A();

OuterAB b = anew B();

bb();

}

}

运行结果

f

a

b

Process finished with exit code

内部类的继承

内部类的继承可以继承内部类也可以继承外部类

/**

* 内部类的继承可以继承内部类也可以继承外部类

*

* @author leizhimin ::

*/

public class Outer {

class Inner {

void doSomething() {

Systemoutprintln(Inner doing );

}

}

class Inner extends Inner {

void doSomething() {

Systemoutprintln(Inner doing );

}

void readme() {

Systemoutprintln(HeHe!);

}

}

}

class Test {

public static void main(String[] args) {

Outer outer = new Outer();

OuterInner in = outernew Inner();

OuterInner in = outernew Inner();

indoSomething();

indoSomething();

inreadme();

}

}

运行结果

Inner doing

Inner doing

HeHe!

Process finished with exit code

总结

内部类是Java中最复杂深奥的概念之一而且内部类在访问控制修饰符继承实现抽象序列化等等很多方面都是一个很让人迷惑的问题在实际中这些问题也许永远没机会没时间搞清但是一般说来懂得以上的内部类的知识就足够用了

内部类的设计也许是弥补Java语言本身的先天不足吧作为语言来说这个特性太变态了点难道就没别的法了?

以上的总结完全是建立在实践基础上的所列举的例子也许偏颇不能全面反映问题的本质希望有兴趣的博友多多发表自己的看法与观点

               

上一篇:Java 实践: 用动态代理进行修饰

下一篇:轻松实现Java用户界面编程