java中内部类的概念

java中内部类的概念,第1张

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

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

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

外层的类的实例,而外层的类不能使用内层的类, 应用athis(最外层类实例) ,abcthis(链中某个外层的实例)。

class TheOuter{

class kk {

class gg {

int tt = 100;

}

}

class aa {

class bb {

int jj = 10;

class cc {

{ int ff = TheOuteraabbthisjj;

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

Systemoutprintln(ff);

}

}

}

}

}

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

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

3

class a0 {

class b0 {

}

}

class vvv{

class ff extends a0b0 {// ff这里不是内部类也行

ff(a0 kk){

kksuper();

}

}

}

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

4

class dd {

void print(){

Systemoutprintln("ddprintln is there");

}

class kk {

kk(int i){}

class cc {

void pp() {

Systemoutprintln("");

}

void ddpp() {

ddthisprint();

}

}

}

}

class aa {

public static void main (String agrs[]) {

ddkkcc test = new dd()new kk(10)new cc();

testddpp();

}

}

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

5 this 是指本类的实例

6 缺省的new

class cc {

{

new test();

}

class kk {

{

Systemoutprintln("there kk");

}

}

class test {

{

new kk();

}

class kk {

{

Systemoutprintln("there test_kk");

}

}

}

}

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

7

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

class vv {

class bb {} //!

class kk {

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

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

}

}

8

class a0 {

class b0 {

}

}

class vvv{

class ff extends a0b0 {// 不是内部类也行

ff(a0 kk){

kksuper();

}

}

}

继承自内部类要调用父类的外层类的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() {

Systemoutprintln(kk);

}

};

}

pp testmed0() {

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

public int get() {

return superget() 10;

}

};

}

}

}

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

10

class bf {

interface kk {}

class aa {

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

//interface gg {}

}

}

一、内部类:

内部类是定义在另一个类中的类,使用它的原因主要有3个:

内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据;

内部类可以对同一个包中的其他类隐藏以来;

当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

举例:《Java核心技术(卷I)》,64节——内部类,程序清单6-6

import javaawt;

import javaawtevent;

import javautil;

import javaxswing;

import javaxswingTimer;

/

  This program demonstrates anonymous inner classes

  @version 110 2004-02-07

  @author Cay Horstmann

 /

public class InnerClassTest

{

    public static void main(String[] args)

    {

        TalkingClock clock = new TalkingClock(1000, true);

        clockstart();

        // keep program running until user selects "Ok"

        JOptionPaneshowMessageDialog(null, "Quit program");

        Systemexit(0);

    }

}

/

  A clock that prints the time in regular intervals

 /

class TalkingClock

{

    private int interval;

    private boolean beep;

    

    /

      Starts the clock

      @param interval the interval between messages (in milliseconds)

      @param beep true if the clock should beep

     /

    public TalkingClock(int interval, boolean beep)

    {

        thisinterval = interval;

        thisbeep = beep;

    }

    

    /

      Starts the clock

     /

    public void start()

    {

        ActionListener listener = new TimePrinter();

        Timer t = new Timer(interval, listener);

        tstart();

    }

    public class TimePrinter implements ActionListener

    {

        public void actionPerformed(ActionEvent event)

        {

            Date now = new Date();

            Systemoutprintln("At the tone, the time is " + now);

            if (beep) ToolkitgetDefaultToolkit()beep();

        }

    }

}

上述代码中,TimePrinter就是在TalkingClock类的内部定义的一个内部类,因此它可以访问外围类的数据域,包括interval和beep这种私有域。

二、局部内部类:

讨论匿名内部类之前,先看看局部内部类,它是在一个方法中定义的类。代码示例如下,这里将上例中的TimePrinter类放到了start()方法中进行定义:

public void start(int interval, final boolean beep)

{

    class TimePrinter implements ActionListener

    {

        public void actionPerformed(ActionEvent event)

        {

            Date now = new Date();

            Systemoutprintln("At the tone, the time is " + now);

            if (beep) ToolkitgetDefaultToolkit()beep();

        }

    }

    ActionListener listener = new TimePrinter();

    Timer t = new Timer(interval, listener);

    tstart();

}

局部内部类不能用public或private访问说明符来声明,它的作用域被限定在声明这个局部内部类的块中。局部内部类可以对外部世界完全地隐藏起来。

局部内部类不仅能访问其外围类,还可以访问局部变量,不过这些局部变量必须被声明为final,如上述代码中start()方法的参数beep所示。

三、匿名内部类

将上面的局部内部类的代码修改一下,就可以定义一个匿名内部类,这种类没有类名。

public void start(int interval, final boolean beep)

    {

        ActionListener listener = new ActionListener()

            {

                public void actionPerformed(ActionEvent event)

                {

                    Date now = new Date();

                    Systemoutprintln("At the tone, the time is " + now);

                    if (beep) ToolkitgetDefaultToolkit()beep();

                }

            };

        Timer t = new Timer(interval, listener);

        tstart();

    }

请参照局部内部类的代码,比较不同之处。TimePrinter这个类名被省略了,定义listener这个局部内部类时,在其后的new ActionListener()后面跟了一个大括号括起的语句块,也就是此匿名内部类的定义语句。匿名内部类除了具有内部类的优点外,还可以减少代码量。

内容有些多,但愿能帮到你^_^

假设外部类叫Out,内部类叫In,那么我们可以使用OutIn in = new Out()new In()来实例化内部类的对象,具体示例代码如下:

class Out {

private int age = 12;

class In {

private int age = 13;

public void print() {

int age = 14;

Systemoutprintln("局部变量:" + age);

Systemoutprintln("内部类变量:" + thisage);

Systemoutprintln("外部类变量:" + Outthisage);

}

}

}

public class Demo {

public static void main(String[] args) {

OutIn in = new Out()new In();

inprint();

}

}

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的class文件,但是前面冠以外部类的类名和$符号。(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量,仍然是只能访问外部类的静态成员变量。典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码 *** 作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

外部类,内部类,匿名类,外部类就是两个类并列的class A {} class B {},内部类:class A { class B {}},B可以直接使用包涵它的类的成员变量,内部类不能被除包涵类以外的类调用;还有就是匿名类,也是内部类 classA{new {}}省略定义类名直接定义方法和使用,这个适用于代码比较简单且这个类不需要被其他类调用

内部类是定义在其他类内部的类。

它几乎可以处于类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分!

内部类是JAVA语言的主要附加部分。

内部类分为:

⒈ 静态内部类

⒉ 成员内部类

⒊ 局部内部类

⒋ 匿名内部类

静态方法的内部类可以访问外部类的静态变量:静态变量

静态方法的内部类可以访问方法的final变量:2

非静态方法的匿名内部类可以访问外部类的静态变量:静态变量

非静态方法的匿名内部类可以访问方法的final变量:2

非静态方法的内部类可以访问外部类的实例变量:实例变量

非静态方法的内部类可以访问外部类的静态变量:静态变量

非静态方法的内部类可以访问方法的final变量:2

非静态方法的匿名内部类可以访问外部类的实例变量:实例变量

非静态方法的匿名内部类可以访问外部类的静态变量:静态变量

非静态方法的匿名内部类可以访问方法的final变量:2

我是静态内部类

我可以访问 外部类的类变量

和外部类静态方法

我可以访问外部的静态变量 外部静态变量

我是成员级内部类,非静态内部类

我可以访问 外部类的实例变量

和外部类实例方法

和外部类静态方法

我可以访问外部的静态变量 外部静态变量

以上就是关于java中内部类的概念全部的内容,包括:java中内部类的概念、java内部类,匿名内部类这些是什么求详细用法,还有语法。、如何实例化 java 内部类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10099737.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存