内部类概述和访问特点

                                                   8.内部类概述和访问特点

A:内部类概述

B:内部类访问特点

a:内部类可以直接访问外部类的成员,包括私有。

b:外部类要访问内部类的成员,必须创建对象。

```java package com.briup.inner;

class Outer { int num = 30;

public class Inner {

    public void function() {

        System.out.println(num);

    }

}

public void method() {

  Inner inner = new Inner();

  inner.function();

} 

}

public class OuterTest { public static void main(String[] args) { Outer outer = new Outer(); outer.method();

}

} ```

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

```java package com.briup.inner;

import com.briup.inner.Outer.Inner;

class Outer { int num = 30;

public class Inner {

    public void function() {

        System.out.println(num);

    }

}

public void method() {

  Inner inner = new Inner();

  inner.function();

} 

}

public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```


                                                    8.1成员内部类私有使用

private

```java package com.briup.inner;

class Outer { private int num = 30;

private class Inner {

    public void function() {

        System.out.println(num);

    }

}

public void method() {

  Inner inner = new Inner();

  inner.function();

} 

}

public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```

                                                         8.2 练习题

```java package com.briup.inner;

class Outer { private int num = 30;

public class Inner {

    int num = 20;

    public void function() {

        int num = 10;

        System.out.println(num);

    }

}

public void method() { Inner inner = new Inner(); inner.function(); }

}

public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.function(); } } ```

                                                           8.2 静态成员内部类

static

B:成员内部类被静态修饰后的访问方式是:

外部类名.内部类名 对象名 = 外部类名.内部类对象;

```java package com.briup.inner;

class Outer { private int num = 30;

static class Inner {

    int num = 20;

    public void function() {

        int num = 10;

        System.out.println(num);

    }

}

}

public class OuterTest { public static void main(String[] args) { Outer.Inner inner = new Outer.Inner(); inner.function(); } } ```

```java package com.briup.inner;

class Outer { private int num = 30;

static class Inner {

    int num = 20;

    public static void function() {

        int num = 10;

        System.out.println(num);

    }

}

}

// 如果内部类定义了内部成员,那么该类一定是静态的 public class OuterTest { public static void main(String[] args) { //Outer.Inner inner = new Outer.Inner(); //inner.function(); Outer.Inner.function(); } } ```


                                                 8.3 成员内部类的面试题

A:面试题

要求:使用已知的变量,在控制台输出30,20,10。

class Outer {

    public int num = 10;

    class Inner {

        public int num = 20;

        public void show() {

            int num = 30;

            System.out.println(?);

            System.out. (??);

            System.out.println(???);

        }

    }

}

class InnerClassTest {

    public static void main(String[] args) {

        Outer.Inner oi = new Outer().new Inner();

        oi.show();

    } 

}

                                            8.4 局部内部类访问局部变量的问题

```java package com.briup.inner;

class Outer { private int num = 30;

public void method() {

    class Inner {

        public void print() {

            System.out.println("sssss");

        }

    }

    Inner inner = new Inner();

    inner.print();

}

}

public class OuterTest { public static void main(String[] args) { } } ```

A:案例演示

局部内部类访问局部变量必须用final修饰

局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用

但是jdk1.8取消了这个事情,所以我认为这是个bug

```java package com.briup.inner;

class Outer { private int num = 30;

public void method() {

    class Inner {

        public void print() {

            System.out.println(num);

        }

    }

    Inner inner = new Inner();

    inner.print();

}

}

public class OuterTest { public static void main(String[] args) { } } ```

                                                       8.5 匿名内部类的格式和理解

A:匿名内部类

就是内部类的简化写法。

B:前提:存在一个类或者接口

这里的类可以是具体类也可以是抽象类。

C:格式:

new 类名或者接口名(){

    重写方法;

}

D:本质是什么呢?

是一个继承了该类或者实现了该接口的子类匿名对象。

E:案例演示

按照要求来一个匿名内部类

                                                8.6 匿名内部类重写多个方法调用

A:案例演示

匿名内部类的方法调用

8.7 匿名内部类在开发中的应用

A:代码如下

```java //这里写抽象类,接口都行 abstract class Person { public abstract void show(); }

class PersonDemo { public void method(Person p) { p.show(); } }

class PersonTest { public static void main(String[] args) { //如何调用PersonDemo中的method方法呢? PersonDemo pd = new PersonDemo ();

}

} ```

                                                          8.8 匿名内部类的面试题

A:面试题

按照要求,补齐代码

java interface Inter { void show(); } class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } }

​ 要求在控制台输出”HelloWorld”

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容