• 内部类专题(自学)


    1.方法内部能不能定义类?


    可以,是方法内部类。


    2.请说明定义内部类的方式,并说明适用于什么情况?


    (1)成员内部类:定义在另一个类(外部类)的内部,而且与成员方法和属性平级,属于类的一个成员,可以用private,默认,protected,public四个访问修饰符修饰。
    外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
    调用方式:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。
    (2)静态内部类:被static修饰的成员内部类叫静态内部类。
    调用方式:外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)。
    (3)局部内部类:定义在代码块或方法体内的类叫局部内部类。
    局部内部类只能在代码块和方法体内使用(如创建对象和使用类对象等)。
    (4)匿名内部类:特殊的局部内部类。
    必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
    只能使用一次,创建实例之后,类定义会立即消失。创建:父类(接口) 实例名 = new 父类(){
    //匿名内部类需要实现的功能。
    }
    匿名内部类不能再是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
    匿名内部类不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是,匿名内部类拥有与父类相同的所有构造方法。
    可以定义代码块,用于实例的初始化。

    3.普通成员内部类能不能直接访问外部类的普通成员?


    普通成员内部类可以直接访问外部类的成员,如上例:内部类中的innerMethod()方法:
    public void innerMethod(){
    int num = 40;
    System.out.println(OuterClass.this.num);//外部类的成员变量;
    System.out.println(this.num);//30
    System.out.println(num);//40
    System.out.println(name);
    }

    4.【上机】写出:调用普通成员内部类的典型方式。


    创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)。

    (1)创建包含内部类的外部类:
    public class OuterClass {
    //成员变量
    private int num=20;
    private String name;
    //构造方法
    public OuterClass() {
    super();
    }
    public OuterClass(String name) {
    super();
    this.name = name;
    }
    //成员方法
    public void execInnerClass(){
    this.name = "abc";
    InnerClass ic = new InnerClass();
    //ic.num=30;
    ic.innerMethod();
    }
    //内部类
    public class InnerClass{
    private int num=30;
    public InnerClass() {
    super();
    }
    public InnerClass(int num) {
    super();
    this.num = num;
    }
    public void innerMethod(){
    int num = 40;
    System.out.println(OuterClass.this.num);//20
    System.out.println(this.num);//30
    System.out.println(num);//40
    System.out.println(name);
    }
    }
    }

    (2)调用成员内部类:两种常用方法;
    1)先创建外部类对象,由外部类对象创建内部类对象
    格式:外部类名.内部类名对象名 = 外部类对象.内部类对象;
    OuterClass oc2 = new OuterClass();
    OuterClass.InnerClass ic = oc2.new InnerClass();

    2)创建外部类对象,外部类的方法操作内部类
    OuterClass oc = new OuterClass();
    oc.execInnerClass();

    5.静态成员内部类能不能直接访问外部类普通成员?能不能访问外部类静态成员?


    静态内部类
    1.不能访问外部类的非静态成员(变量或者方法)。
    2.可以访问外部类的静态成员。


    6.【上机】写出:调用静态内部类的典型方式。


    (1)创建包含静态内部类的外部类:
    public class OuterClass{
    //成员变量
    private static int num=20;
    private static String name;
    //构造方法
    public OuterClass() {
    super();
    }
    public OuterClass(String name) {
    super();
    this.name = name;
    }
    //成员方法
    public void execInnerClass(){
    this.name = "abc";
    InnerClass ic = new InnerClass();
    //ic.num=30;
    ic.innerMethod();
    }
    //内部类
    public static class InnerClass{
    private int num=30;
    public InnerClass() {
    super();
    }
    public InnerClass(int num) {
    super();
    this.num = num;
    }
    public void innerMethod(){
    int num = 40;
    //System.out.println(OuterClass.this.num);//20
    System.out.println(OuterClass.num);
    System.out.println(this.num);//30
    System.out.println(num);//40
    System.out.println(name);
    }
    }
    }
    (2)静态内部类对象可以直接创建实例,不必依附于外部类实例:
    OuterClass.InnerClass ic = new OuterClass.InnerClass();
    格式:外部类名.内部类名对象名 = new 外部类名.内部类名();

    7.什么时候会使用匿名内部类?


    有些情况下,某些类创建对象一次后再也不使用了。这种情况下就可以不提供有名字的类,而是使用匿名内部类。

  • 相关阅读:
    Python 第四十九章 css 补充
    Python 第四十八章 css样式
    Python 第四十七章 css介绍
    iOS 流媒体 基本使用 和方法注意
    iOS 展示 gif
    iOS UIImage UIImageView 展示图片 不变形 处理
    UIImageView 获取图片的 宽 高
    iOS tabbar 上面更换任意图
    iOS 屏幕原点坐标 && 导航栏风格的自定义
    iOS NSDateFormatter 不安全线程 处理
  • 原文地址:https://www.cnblogs.com/ren549047861/p/11294224.html
Copyright © 2020-2023  润新知