Java内部类原理、概述与用法实例详解

本文实例讲述了Java内部类原理、概述与用法。分享给大家供大家参考,具体如下:

内部类的概述

/*
  内部类概述:
    把类定义在其他类的内部,这个类就被称为内部类。
    举例:在类A中定义了一个类B,类B就是内部类。
  内部的访问特点:
    A:内部类可以直接访问外部类的成员,包括私有。
    B:外部类要访问内部类的成员,必须创建对象。
*/
class Outer {
  private int num = 10;
  class Inner {
    public void show() {
      //内部类可以直接访问外部类的成员,包括私有。
      System.out.println(num);
    }
  }
  public void method() {
    //找不到符号
    //show();
    //外部类要访问内部类的成员,必须创建对象。
    Inner i = new Inner();
    i.show();
  }
}
class InnerClassDemo {
  public static void main(String[] args) {
  }
}

内部类位置

/*
  内部类位置
    成员位置:在成员位置定义的类,被称为成员内部类。
    局部位置:在局部位置定义的类,被称为局部内部类。
  成员位置:在成员位置定义的类,被称为成员内部类。
*/
class Outer {
  private int num = 10;
  //成员位置
  /*
  class Inner {
  }
  */
  public void method() {
    //局部位置
    class Inner {
    }
  }
}
class InnerClassDemo2 {
  public static void main(String[] args) {
  }
}

如何直接访问成员内部类的成员

/*
  成员内部类:
    如何直接访问内部类的成员。
    外部类名.内部类名 对象名 = 外部类对象.内部类对象;
*/
class Outer {
  private int num = 10;
  class Inner {
    public void show() {
      System.out.println(num);
    }
  }
}
class InnerClassDemo3 {
  public static void main(String[] args) {
    //需求:我要访问Inner类的show()方法
    //格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
    Outer.Inner oi = new Outer().new Inner();
    oi.show();
  }
}

成员内部类的修饰符:

/*
  成员内部类的修饰符:
    private 为了保证数据的安全性
    static 为了方便访问数据
      注意:静态内部类访问的外部类数据必须用静态修饰。
  案例:我有一个人(人有身体,身体内有心脏。)
    class Body {
      private class Heart {
        public void operator() {
          System.out.println("心脏搭桥");
        }
      }
      public void method() {
        if(如果你是外科医生) {
          Heart h = new Heart();
          h.operator();
        }
      }
    }
    按照我们刚才的讲解,来使用一下
    Body.Heart bh = new Body().new Heart();
    bh.operator();
    //加了private后,就不能被访问了,那么,怎么玩呢?
    Body b = new Body();
    b.method();
*/
class Outer {
  private int num = 10;
  private static int num2 = 100;
  //内部类用静态修饰是因为内部类可以看出是外部类的成员
  public static class Inner {
    public void show() {
      //System.out.println(num);
      System.out.println(num2);
    }
    public static void show2() {
      //System.out.println(num);//报错。静态内部类访问的外部类数据必须用静态修饰。
      System.out.println(num2);
    }
  }
}
class InnerClassDemo4 {
  public static void main(String[] args) {
    //使用内部类
    // 限定的新静态类
    //Outer.Inner oi = new Outer().new Inner();//这个访问方式错误
    //oi.show();
    //oi.show2();
    //成员内部类被静态修饰后的访问方式是:
    //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
    Outer.Inner oi = new Outer.Inner();
    oi.show();
    oi.show2();
    //show2()的另一种调用方式。因为静态方法,可以通过类名调用。
    Outer.Inner.show2();
  }
}

内部类和外部类没有继承关系。

通过外部类名限定this对象

/*
  案例:
    要求请填空分别输出30,20,10。
  注意:
    1:内部类和外部类没有继承关系。
    2:通过外部类名限定this对象
      Outer.this
*/
class Outer {
  public int num = 10;
  class Inner {
    public int num = 20;
    public void show() {
      int num = 30;
      System.out.println(num);
      System.out.println(this.num);
      //System.out.println(new Outer().num);
      System.out.println(Outer.this.num);
    }
  }
}
class InnerClassTest {
  public static void main(String[] args) {
    Outer.Inner oi = new Outer().new Inner();
    oi.show();
  }
}

局部位置的内部类访问局部变量问题

/*
  局部内部类
    A:可以直接访问外部类的成员
    B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
  注意事项:
    局部内部类访问局部变量的注意事项?
    A:局部内部类访问局部变量必须用final修饰
    B:为什么呢?
      局部变量是随着方法的调用而调用,随着调用完毕而消失。
      而堆内存Inner的内容并不会立即消失。所以,我们加final修饰。
      加入final修饰后,这个变量就成了常量。既然是常量。你消失了。
      我在内存中存储的是数据20,所以,我还是有数据在使用。
*/
class Outer {
  private int num = 10;
  public void method() {
    //int num2 = 20;
    final int num2 = 20; //局部内部类访问局部变量必须用final修饰
    class Inner {
      public void show() {
        System.out.println(num);
        //从内部类中访问本地变量num2; 需要被声明为最终类型
        System.out.println(num2);//20
      }
    }
    //System.out.println(num2);
    Inner i = new Inner();
    i.show();
  }
}
class InnerClassDemo5 {
  public static void main(String[] args) {
    Outer o = new Outer();
    o.method();
  }
}

匿名内部类格式,方法调用

/*
  匿名内部类
    就是内部类的简化写法。
  前提:存在一个类或者接口
    这里的类可以是具体类也可以是抽象类。
  格式:
    new 类名或者接口名(){
      重写方法;
    }
  本质是什么呢?
    是一个继承了该类或者实现了该接口的子类的匿名对象。
*/
interface Inter {
  public abstract void show();
  public abstract void show2();
}
class Outer {
  public void method() {
    Inter i = new Inter() { //多态
      public void show() {
        System.out.println("show");
      }
      public void show2() {
        System.out.println("show2");
      }
    };
    i.show();//是一个继承了该类或者实现了该接口的子类的匿名对象。所以可以调用方法
    i.show2();
  }
}
class InnerClassDemo6 {
  public static void main(String[] args) {
    Outer o = new Outer();
    o.method();
  }
}

匿名内部类在开发中的使用

/*
  匿名内部类在开发中的使用
*/
interface Person {
  public abstract void study();
}
class PersonDemo {
  //接口名作为形式参数
  //其实这里需要的不是接口,而是该接口的实现类的对象
  public void method(Person p) {
    p.study();
  }
}
//实现类
class Student implements Person {
  public void study() {
    System.out.println("好好学习,天天向上");
  }
}
class InnerClassTest2 {
  public static void main(String[] args) {
    //测试
    PersonDemo pd = new PersonDemo();
    Person p = new Student();
    pd.method(p);
    System.out.println("--------------------");
    //匿名内部类在开发中的使用
    //匿名内部类的本质是继承类或者实现了接口的子类匿名对象
    //用完一次就消失
    Person ss = new Person(){
      public void study() {
        System.out.println("好好学习,天天向上");
      }
    };
    pd.method(ss);
    // pd.method(new Person(){
      // public void study() {
        // System.out.println("好好学习,天天向上");
      // }
    // });
  }
}

案例

/*
  案例:
    按照要求,补齐代码
      interface Inter { void show(); }
      class Outer { //补齐代码 }
      class OuterDemo {
        public static void main(String[] args) {
           Outer.method().show();
         }
      }
      要求在控制台输出”HelloWorld”
*/
interface Inter {
  void show();
  //记得默认有 public abstract
}
class Outer {
  //补齐代码
  public static Inter method() {
    //子类对象 -- 子类匿名对象
    return new Inter() {
      public void show() {
        System.out.println("HelloWorld");
      }
    };
  }
}
class OuterDemo {
  public static void main(String[] args) {
    Outer.method().show();
    /*
      1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
      2:Outer.method().show()可以看出method()方法的返回值是一个对象。
        又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
    */
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • java内部类原理与用法详解

    本文实例讲述了java内部类原理与用法.分享给大家供大家参考,具体如下: 概念 内部类:可以包含在另外一个类中的类 外部类:包含内部类的类 每个内部类都会被编译为一个独立的类,生成一个独立的字节码文件. 内部类可以方便地访问外部类的私有变量,内部类也可以声明为private从而实现对外完全隐藏. 分类 java中的四种内部类(根据定义的位置和方式划分) -静态内部类 -成员内部类 -方法内部类 -匿名内部类 分类介绍 -静态内部类 特征:在类的内部中存在另一个类,且该类被static修饰 使用范

  • Java干货知识深入理解内部类

    前言 说起内部类,大家并不陌生,并且会经常在实例化容器的时候使用到它.但是内部类的具体细节语法,原理以及实现是什么样的可以不少人都还挺陌生,这里作一篇总结,希望通过这篇总结提高对内部类的认识. 内部类是什么? 由文章开头可知,内部类的定义为:定义在另一个类或方法中的类.而根据使用场景的不同,内部类还可以分为四种:成员内部类,局部内部类,匿名内部类和静态内部类.每一种的特性和注意事项都不同,下面我们一一说明. 成员内部类 顾名思义,成员内部类是定义在类内部,作为类的成员的类.如下: public

  • Java 中引入内部类的意义?

    前言 这是个好问题,因为它让我想起来自己刚学到内部类时候的"想用的冲动". 导致我代码里到处都是层层的内部类套嵌.不但经常搞得静态域错误一堆(内部类不允许有static成员字段),而且过一段时间自己都搞不清当初写的是什么. 一个很重要的设计准则是:设计是做减法,能不用模式就不用模式. 这个准则对内部类来说同样适用. 所以回答这个问题的基调应该是: 能不用内部类就不用内部类. 实践 我以前觉得内部类用来有针对性地暴露外部类的特定接口,比一下子把整个对象都给人家要好.比如说下面代码中的外部

  • Java为什么匿名内部类参数引用需要用final进行修饰?

    事实上,除了匿名内部类参数,方法和作用域内的内部类内部使用的外部变量也必须是final 的.原因大致总结一下: 简单解释就是: 方法中的局部变量的生命周期很短,方法结束后变量就要被销毁,加上final是为了延长变量的生命周期. 进一步解释: 内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以

  • Java内部类及其特点的讲解

    定义在类里面的类就叫做内部类. 内部类的特点: 在内部类中可以直接访问外部类的成员,包括私有的成员 在外部类中不能直接访问内部类的成员,必须通过创建内部类的对象来调用内部类成员 如何创建内部类对象: 内部类名 对象名= new 内部类名(); 对象名.成员名    但是私有化的东西还是不能访问的 可以修饰内部类的修饰符有哪些: private   static 如果通过private 修饰 ,只能在外部类中提供公共的方法对内部类进行访问 如果是static 修饰,如何创建外部类对象 外部类名.内

  • java中静态导入机制用法实例详解

    java中静态导入机制用法实例详解 这里主要讲解了如何使用Java中静态机制的用法,这里提供了简单实例大家可以参考下. 静态常量类 在java开发中,我们会经常用到一些静态常量用于状态判断等操作.为了能够在多个地方复用这些常量,通常每个模块都会加一个常量类,举个简单的列子: import com.sky.OrderMouleConsstants; /** * Created by gantianxing on 2017/4/21. */ public class Test { public vo

  • Java内部类原理、概述与用法实例详解

    本文实例讲述了Java内部类原理.概述与用法.分享给大家供大家参考,具体如下: 内部类的概述 /* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部类的成员,包括私有. B:外部类要访问内部类的成员,必须创建对象. */ class Outer { private int num = 10; class Inner { public void show() { //内部类可以直接访问外部类的

  • JAVA中的final关键字用法实例详解

    本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

  • JAVA中static方法的用法实例详解

    本文实例讲述了JAVA中static方法的用法.分享给大家供大家参考,具体如下: static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区或者方法区内找到他们.因此,static对象可以在它的任何对象创建之前访

  • Java设计模式之策略模式原理与用法实例详解

    本文实例讲述了Java设计模式之策略模式原理与用法.分享给大家供大家参考,具体如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.其中JDK里面的TreeSet类和TreeMap类就用到了策略模式.这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的. 策略模式

  • Java设计模式之装饰模式原理与用法实例详解

    本文实例讲述了Java设计模式之装饰模式原理与用法.分享给大家供大家参考,具体如下: 装饰模式能在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.JDK中IO的设计就用到了装饰模式,通过过滤流对节点流进行包装来实现功能的扩展. 装饰模式的角色的组成: ① 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加工功能的对象.(InputStream.OutputStream) ② 具体构件(Concrete Co

  • Java List 用法实例详解

    Java List 用法实例详解 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引 ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步 LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快) Vector:底层

  • Java中的instanceof关键字在Android中的用法实例详解

    在下面介绍Android中如何使用instanceof关键字开发更方便时,先来温习一下java中instanceof的概念. instanceof大部分的概念是这样定义的:instanceof是Java的一个二元操作符,和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据.举个栗子: String s = "I AM an Object!"; boolean isObj

  • MyBatis动态SQL标签用法实例详解

    1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from icp <dynamic prepend="where&quo

  • JAVA 静态的单例的实例详解

    JAVA  静态的单例的实例详解 实现代码: public class Printer { private Printer(){ } public static Printer newInstance(){ return CreatePrinter.mPrinter; } private static class CreatePrinter{ private final static Printer mPrinter = new Printer(); } } 因为静态的单例对象没有作为类的成员变

随机推荐