Java 静态内部类作用?

Python029

Java 静态内部类作用?,第1张

1、变值权限修饰作用,在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

2、在某些特殊的情况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。

3、最主要的时这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。

这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。

扩展资料

例如:

对于两个类,拥有相同的方法:

class People{

run()

}

interface Machine{

run()

}

此时有一个robot类:

class Robot extends People implement Machine.

此时run()不可直接实现。

interface Machine{

void run()

}

class Person{

void run(){

System.out.println("run")

}

}

class Robot extends Person{

private class MachineHeart implements Machine{

public void run(){

System.out.println("heart run")

}

}

public void run(){

System.out.println("Robot run")

}

Machine.getMachine(){returnnew MachineHeart()

}

class Test{

publicstaticvoid main(String[] args){

Robot robot=new Robot()

Machine m=robot.getMachine()

m.run()

robot.run()

}

}

参考资料来源:百度百科-静态内部类

在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。只不过相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,可以被任意修饰符修饰。编译器在编译时,内部类的名称为OuterClass$InnerClass.class 。

1、内部类访问数据变量

当在某些时候,内部类中定义的变量与外部类中变量名称相同时,如何确保正确地访问每一个变量呢?

1.1在main中直接从外部类调用内部类的方法

class Outer

{

private int index = 10

class Inner

{

private int index = 20

void print()

{

int index = 30

System.out.println(this)// the object created from the Inner

System.out.println(Outer.this)// the object created from the Outer

System.out.println(index)// output is 30

System.out.println(this.index)// output is 20

System.out.println(Outer.this.index)// output is 10

}

}

void print()

{

Inner inner = new Inner()//得到内部类的引用

inner.print()

}

}

class Test

{

public static void main(String[] args)

{

Outer outer = new Outer()

outer.print()

}

}

在这里内部类Inner中关键字this指向内部类Inner的对象,如果要想指向外部类的对象,必须在this指针前加上外部类名称,表示this是指向外部类构造的碎屑,如Outer.this 。

1.2在main中显式返回内部类引用

class Outer

{

private int index = 10

class Inner

{

private int index = 20

void print()

{

int index = 30

System.out.println(index)

System.out.println(this.index)

System.out.println(Outer.this.index)

}

}

Inner getInner()

{

return new Inner()//返回一个内部类的引用

}

}

class Test

{

public static void main(String[] args)

{

Outer outer = new Outer()

Outer.Inner inner = outer.getInner()

inner.print()

}

}

Inner是Outer的内部类,所以在类Test中必须用属性引用符来标识出内部类。

1.3当main方法在Outer类内部

class Outer

{

private int index = 10

class Inner

{

private int index = 20

void print()

{

int index = 30

System.out.println(index)

System.out.println(this.index)

System.out.println(Outer.this.index)

}

}

Inner getInner()

{

return new Inner()//返回一个内部类的引用

}

public static void main(String[] args)

{

Outer outer = new Outer()

Inner inner = outer.getInner()// 注意此处变化

inner.print()

}

}

因为main方法在Outer内部,故可以直接引用,不需要属性引用符。

1.4在main方法中直接产生内部类对象

class Test

{

public static void main(String[] args)

{

Outer outer = new Outer()

Outer.Inner inner = outer.new Inner()// 注意此处变化

inner.print()

}

}

在利用new构造方法构造一个外部类对象时,并没有连带着构造一个内部类对象,故需要访问内部类方法时,必须使用new操作符为这个外部类对象再构造一个内部类对象。

2、局部内部类

在方法中定义的内部类是局部内部类,它只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,延长了其生命周期,使得方法在消亡时,其内部类仍可以访问该变量。另外,它同样也可以引用定义在外部类的变量和方法。而且方法体中的局部内部类不允许有访问修饰符。

class Outer

{

int num=10

public void print(final int aArgs)

{

class Inner

{

int num=20

public Inner()

{

System.out.println("This is Inner.")//此句可看出它与匿名内部类用法的不同。

}

public void print()

{

int num=30

System.out.println(this)// the object created from the local Inner

System.out.println(num)

System.out.println(this.num)

System.out.println(Outer.this.num)

System.out.println(aArgs)

}

}

Inner inner=new Inner()//此句必须放在定义类Inner的后面

inner.print()

}

public static void main(String[] args)

{

Outer outer=new Outer()

outer.print(40)

}

}

对于局部类的命名,不管是在一个方法中定义多个类还是在几个方法中分别定义类,其编译后命名是:OuterClass$1InnerClass.class

3、匿名内部类

匿名内部类作为一种特殊的内部类,除了具有普通内部类的特点,还有自己的一些独有特性:

匿名内部类必须扩展一个基类或实现一个接口,但是不能有显式的extends和implements子句;

匿名内部类必须实现父类以及接口中的所有抽象方法;

匿名内部类总是使用父类的无参构造方法来创建实例。如果是实现了一个接口,则其构造方法是Object();

匿名内部类编译后的命名为:OuterClass$n.class,其中n是一个从1开始的整数,如果在一个类中定义了多个匿名内部类,则按照他们的出现顺序从1开始排号。

abstract class A

{

abstract public void sayHello()

}

class Outer

{

public static void main(String[] args)

{

new Outer().callInner(new A()

{

public void sayHello()

{

System.out.println(this)// the object created from the anonymous Inner

System.out.println("Hello!")

}

})

}

public void callInner(A a)

{

a.sayHello()

}

}

4、静态内部类

和非静态内部类相比,区别就在于静态内部类没有了指向外部类的引用。除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。一个静态的内部类,才可以声明一个static成员,静态内部类可以访问外围类的静态方法、成员(包括private static的成员)。静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类。而对于非静态内部类则必须先实例化其外部类,才能再实例化本身。

5.内部类的继承

当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:

class WithInner

{

class Inner

{

public void sayHello()

{

System.out.println("Hello.")

}

}

}

public class Test extends WithInner.Inner

{

Test(WithInner wi)

{

wi.super()

}

public static void main(String[] args)

{

WithInner wi=new WithInner()

Test test=new Test(wi)

test.sayHello()

}

}

因为每一个内部类都有一个指向外部类的引用,在继承一个内部类,必须先创建一个外部类,通过这个外部类引用来调用其内部类的构造方法。如果继承的内部类是一个静态内部类,则就不需要这样,直接super()调用即可;

6、内部类的2种特殊用法

一个类从另一个类派生出来,又要实现一个接口。但在接口中定义的方法与父类中定义的方法的意义不同,则可以利用内部类来解决这个问题。

interface Machine

{

void run()

}

class Person

{

void run()

{

System.out.println("run")

}

}

class Robot extends Person

{

private class MachineHeart implements Machine

{

public void run()

{

System.out.println("heart run")

}

}

Machine getMachine()

{

return new MachineHeart()

}

}

class Test

{

public static void main(String[] args)

{

Robot robot = new Robot()

Machine m = robot.getMachine()

m.run()

robot.run()

}

}

在Robot类内部使用内部类MachineHeart来实现接口Machine的run方法。同时Robot类又继承了父类Person的run方法。如果不使用内部类MachineHeart而使Robot直接实现接口Machine,则该如何调用父类的run方法?

利用内部类可解决c++中多重继承所解决的问题

class A

{

void fn1()

{

System.out.println("It' s fn1.")

}

}

abstract class B

{

abstract void fn2()

}

class C extends A

{

B getB()

{

return new B()

{

public void fn2()

{

System.out.println("It' s fn2.")

}

}

}

}

class Test

{

public static void main(String[] args)

{

C c = new C()

c.fn1()

c.getB().fn2()

}

}

类C既要继承类A又要继承类B,则可将类B的定义放入类C内部,使之成为内部类。

一般情况下 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。另外一个很好的理由是java内部类加上接口可以有效地实现多重继承。

简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。 1 Static member class(静态成员类) 类声明中包含“static”关键字的内部类。如以下示例代码, Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。

1内部类的嵌套可以理解成类的链关系,在构造一个内部类(非static)的实例的时候,会将直接外层类的实例

作为参数传进构造函数,而外层类的实例也是用其外层类的实例构造,所以是一种链状关系,内部的类可以使用所有

外层的类的实例,而外层的类不能使用内层的类, 应用a.this(最外层类实例) ,a.b.c.this(链中某个外层的实例)。

class TheOuter{

class kk {

class gg {

int tt = 100

}

}

class aa {

class bb {

int jj = 10

class cc {

{ int ff = TheOuter.aa.bb.this.jj

// 无法直接访问到gg不在链关系内

System.out.println(ff)

}

}

}

}

}

2 创建一个内部类 new aa().new bb().new()cc 实际上是调用 外层类实例.new 本层构造函数()

如果内部类是static的不需要外层类的实例 多个static嵌套的内部类的实例 aa.bb.cc test = new aa.bb.cc()

3

class a0 {

class b0 {

}

}

class vvv{

class ff extends a0.b0 {// ff这里不是内部类也行

ff(a0 kk){

kk.super()

}

}

}

继承自内部类要调用父类的外层类的super()

4

class dd {

void print(){

System.out.println("dd.println is there")

}

class kk {

kk(int i){}

class cc {

void pp() {

System.out.println("****")

}

void ddpp() {

dd.this.print()

}

}

}

}

class aa {

public static void main (String agrs[]) {

dd.kk.cc test = new dd().new kk(10).new cc()

test.ddpp()

}

}

在类内部可以是使用外层类,但是如果生成一个实例的句柄就没有提供访问上层类的功能。

5 this 是指本类的实例

6 缺省的new

class cc {

{

new test()

}

class kk {

{

System.out.println("there kk")

}

}

class test {

{

new kk()

}

class kk {

{

System.out.println("there test_kk")

}

}

}

}

可以直接使用new,new的范围可以是 之际外层.this.new 和this.new 但是如果内层与外层出现同名类以内部优先

7

//当有链关系的时候要注意类不要重名

class vv {

class bb {} //!

class kk {

//class vv{} 这样就会出错

class bb {} //!这样就不会出错

}

}

8

class a0 {

class b0 {

}

}

class vvv{

class ff extends a0.b0 {// 不是内部类也行

ff(a0 kk){

kk.super()

}

}

}

继承自内部类要调用父类的外层类的super()

9 匿名内部类

interface oo {

//oo(int g) {}

int k = 10

void pt()

}

class pp {

pp(int g) {

}

int get() {

return 100

}

}

class me {

/*

interface oo {

void pt()

}

*/

class kk{

oo testmed() {

final int i = 10

int g = 100

return new oo() {

int kk

{

// 使用外面的东西要声名成final

// 继承接口内部优先

// 匿名内部类没有构造函数,只能使用块,初始化

kk = i + k

}

public void pt() {

System.out.println(kk)

}

}

}

pp testmed0() {

return new pp(10){ // 继承自类

public int get() {

return super.get() * 10

}

}

}

}

}

匿名内部类可以继承自接口也可以继承自类,继承自类的构造函数中 可以有参数。

10

class bf {

interface kk {}

class aa {

// 接口能嵌套在接口中(不受限制),或者嵌套在顶层,下面就不行

//interface gg {}

}

}