zoukankan      html  css  js  c++  java
  • 内部类

    内部类:如果一个事物,内部包含另外一个事物,那么这就是一个类 内部包含另一个类

    例如:身体和心脏的关系,汽车和发动机的关系

    分类:

    1.成员内部类:

    2.局部内部类(包含匿名内部类)

    1.成员内部类:定义在外部类中的

    格式:

    修饰符 class 外部类名称{

      修饰符 class 内部类名称{}

    }

    注意:内用外,随意访问;外用内,需要内部对象

    使用方法:

     间接方法:在外部类方法中,使用内部类;然后 main 只是调用外部类方法

     直接方法:公式:       外部类名称 . 内部类名称 对象名 = new 外部类名称 () . new 内部类名称()

    public class Body {
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void method() {
            System.out.println("外部类方法");
            new Heart().beat();
    
        }
    
        private String name;
    
        public class Heart {
    
            public void beat() {
                System.out.println("蹦蹦蹦!");
                System.out.println("我叫 " + name);
            }
        }
    }
    public class demo1 {
        public static void main(String[] args) {
            Body body = new Body();
            body.setName("心脏");
            body.method();
    
            System.out.println("==================");
    
            Body.Heart heart = new Body().new Heart();
            heart.beat();
        }
    }

    内部类的同名变量访问:

    内部类访问内部类的成员变量:this.num

    内部类访问外部类的成员变量:外部类名称 .this .num

    2.局部内部类:定义在外部类,成员方法中的(只有该方法能用,出了方法就不行了)

    格式:

    修饰符 class 外部类 {

      修饰符 返回值类型 外部类方法名(参数列表){

        class 内部类名称 { }

      }

    }

    public class Out {
        public void method() {
            class In {
           int num = 100; // 这个 num 必须是有效 final 的,不可以再赋值,或者直接 final int num = 100;
    public void methodIn() { System.out.println("内部类方法"); } } new In().methodIn(); } }
    public class demo2main {
        public static void main(String[] args) {
            Out out = new Out();
            out.method();
        }
    }

    只该方法用,出了就不行

    如果访问所在方法的局部变量,那这个局部变量必须是【有效 final 的】,因为局部内部类可以找到常量池的常量内容,一旦改变,就找不到了,数据就变了

    3.匿名内部类,也是局部内部类的一种

    如果接口的实现类(或者父类的子类)只需要使用一次,那么这种情况就可以省略类的定义,改而是用匿名内部类

    格式:

    接口名称 对象名 = new 接口名称 { 重写的方法 };    (分号不可以掉)

    再用对象名调用方法

    解析:

    1.new是创建对象的动作

    2.接口名称就是匿名内部类要实现的接口

    3. {...}  就是匿名内部类的内容

    注意事项:

    1.匿名内部类在创建对象的时候只能使用唯一一次;

    如果希望创建多个对象,就只能重复创建匿名内部类;或者使用实现类

    2.有名称的匿名内部类,只能使用唯一一次,但是可以调用多个方法

     没有对象名的匿名内部类,只能调用一个方法,在分号前调用

    3.匿名内部类省略了 实现类/子类名,匿名对象省略了对象名称

    匿名内部类和匿名对象是两回事

    package Niminglei;
    
    public class demo1main {
        public static void main(String[] args) {
    //使用了匿名内部类,但是有对象名称,对象名为 ok Ok ok
    = new Ok() { @Override public void method() { int num = 100; System.out.println(num); } }; ok.method();
    //使用了匿名内部类,但是没有对象名称
    new Ok() { @Override public void method() { int num = 100; System.out.println("好的"); } }.method(); } }

    类的权限修饰符规则:

    1.外部类:public / (default)

    2.成员内部类:public / protected / (default) / private

    3.局部内部类:什么都不能写

  • 相关阅读:
    字典转模型
    iOS开发之---传值大全
    UITableViewCell重用机制
    通知/代理/block 三者比对
    内存的那些事
    C++
    C#接口实现案例
    4.2 C#-----------------------------操作符的重载------------------------------------------
    C#抽象类和抽象方法的实现
    C#----析构函数
  • 原文地址:https://www.cnblogs.com/aoligei/p/12384579.html
Copyright © 2011-2022 走看看