根据内部类的位置不同,可将内部类分为 :成员内部类与局部内部类。

  1. class outer{
  2. class inner{//成员内部类
  3. }
  4. public void method() {
  5.     class local_inner{ //局部内部类
  6. }
  7. }
  8. }

1、成员内部类

(1)访问格式:

  1. 外部类名.内部类名 对象名=外部类对象.内部类对象
  1. //注意不要用中文全角空格,否则会出错!编译不通过!
    class outer{
    class inner{
    public void show()
             {
                System.out.println("你好");
        }
     }
    }
    public class niming{
      public static void main(String[]args) {
        outer.inner b=new outer().new inner(); //创建对象访问对应内部类函数成员
        b.show(); }
    }

虽然内部类可以以上述方式访问,但实际开发中,常将内部设为私有成员,以保护数据的安全,不让外部直接使用
(2)将内部类设为私有成员

  1. class outer{
  2. //成员内部类,设为私有
  3. private class inner{
  4. public void show()
  5. {
  6. System.out.println("你好"); }
  7. }
  8. public void show1() {
  9. inner b=new inner();
  10. b.show(); }
  11. }
  12. public class niming{
  13. public static void main(String[]args) {
  14. //创建对象访问对应内部类函数成员
  15. outer c=new outer();
  16. c.show1();
  17. }
  18. }

(3)将内部类设为静态类

eg1:

  1. class outer{
  2. //静态成员变量
  3. private static int num=20;
  4. //静态成员方法
  5. public static void show2() {
  6. System.out.println("hello world");
  7. }
  8. //成员内部类,设为私有静态
  9. private static class inner{
  10. public void show() {
  11. System.out.println(num); //静态内部类访问外部类成员时,只能访问外部类的静态成员
  12. show2();
  13. }
  14. }
  15. public void show1() {
  16. inner b=new inner();
  17. b.show();
  18. }
  19. }
  20. public class niming {
  21. public static void main(String[]args) {
  22.   outer c=new outer();
  23.   c.show1();
  24. }
  25. }

eg2:

eg3: Private 保证了数据的安全 ,Static 让数据访问更方便

  1. class Outer {
  2. public int num = 10;
  3. class Inner {
  4. public int num = 20;
  5. public void show() {
  6. int num = 30;
  7. //三个变量对应的变量名相同
  8. //访问的是本方法中的num变量,满足就近原则
  9. System.out.println(num);
  10. //通过this变量,访问方法外,本类中的变量,this代表Inner类对象
  11. System.out.println(this.num);
  12. //通过外部类名加this,返回外部类对象,访问对象外部类的
  13. 13 System.out.println(Outer.this.num);
  14. //通过创建对象的方式访问外部成员变量不推荐
  15. //System.out.println(new Outer().num); }
  16. }
  17. }
    }
  18. public class niming{
  19.   public static void main(String[]args) {
  20.     Outer.Inner inner=new Outer().new Inner();
        inner.show();
  21. }
  22. }

2、局部内部类

  1. public class Outer{
        int num1 = 1;
        static int num2=2;
        public void inner(){
        System.out.println("局部内部类");
        int num3 = 3;
       // static int num4=4; //error,不能用static修饰
            class InnerClass{   
  2.  
  3. //局部内部类的类体中不可以声明类变量和类方法,局部内部类不能用static修饰。成员内部类不存在这个限制。
            private int num5 = 5;
        //private static int num6 = 6; //error
            private final static int num7 = 7; //ok
        private static final int num8 = 8; //ok
        public void testNum()
             {
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(this.num5);//ok  
            }
         }
        InnerClass a=new InnerClass();
        a.testNum();
       }
    public static void main(String[]args) { Outer c= new Outer(); c.inner(); }
    }

成员内部类的字节码文件会不一样。会变成外部类名$number内部类名

 3、匿名内部类

匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有显式声明的构造函数.

  • 匿名类就是利用父类的构造函数和自身类体构造成一个类。

  • 匿名类可以继承父类的方法,也可以重写父类的方法。
  • 匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法
  • 匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)
  • 匿名类永远不能是抽象的。
  • 匿名类总是隐式的final.
  • 匿名类总是一个内部类;并且不能是static的

编译时的命名规则:

  1. 内部类的class文件命名是:主类+$+内部类名
  2. 匿名类的class文件命名是:主类+$+(1,2,3….)

实际使用中我们只需注意这几点儿:
1. 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2. 匿名内部类中是不能定义构造函数的。
3. 匿名内部类中不能存在任何的静态成员变量和静态方法。
4. 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5. 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

访问权限
1. 访问外层Class里面的字段。
2. 不能访问外层方法中的本地变量。除非变量是final。
3. 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
4. 不能定义静态初始化代码块
5. 不能在匿名类里面定义接口
6. 不能在匿名类中定义构造函数

实现接口方法的例子:

————————————————
版权声明:本文为CSDN博主「yin__ren」的原创文章,遵循undefined版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yin__ren/article/details/79177597

Java 内部类,成员类,局部类,匿名类等的更多相关文章

  1. Java内部类与外部类

    错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...

  2. java 内部类、匿名内部类、嵌套类的使用

    我们都知道java的类能够由public.default(缺省.不写)来修饰,分别表示的含义是同意公开訪问以及仅仅同意包内其他类訪问,而同一包内的类一般是为完毕同一个功能而协作.      除此之外, ...

  3. Java内部类与外部类的那些事

    昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...

  4. java 内部类与外部类的区别

    最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件.现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢 ...

  5. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  6. java内部类和外部类

    1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...

  7. Java内部类和外部类的通信探索

    1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...

  8. 从字节码的角度看Java内部类与外部类的互相访问

    Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...

  9. Java内部类引用外部类中的局部变量为何必须是final问题解析

    今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方 ...

随机推荐

  1. 去sqlserver日志

    USE [master] GO ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE DNName SET  ...

  2. net core发邮件——MimeKit

    var message = new MimeMessage(); message.From.Add(new MailboxAddress("谁发的", "发送方的邮件地址 ...

  3. 从psd图中将图层导出成单独文件

  4. Dart编程数据类型

    编程语言最基本的特征之一是它支持的数据类型集.这些是可以用编程语言表示和操作的值的类型. Dart语言支持以下类型 数字 字符串 布尔 列表list map 数字 Dart中的数字用于表示数字文字.D ...

  5. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  6. BZOJ 4817: [Sdoi2017]树点涂色(lct+线段树)

    传送门 解题思路 跟重组病毒这道题很像.只是有了一个询问\(2\)的操作,然后询问\(2\)的答案其实就是\(val[x]+val[y]-2*val[lca(x,y)]+1\)(画图理解).剩下的操作 ...

  7. 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)

    传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...

  8. centos7 开机自动执行shell脚本

    centos7 开机自动执行shell脚本 90十80 关注 2018.12.23 09:37 字数 309 阅读 485评论 0喜欢 0 自己新建一个脚本,如centnet-service.sh 经 ...

  9. (转)The connection to adb is down, and a severe error has occured. .

    转:http://blog.csdn.net/yu413854285/article/details/7559333 启动android模拟器时.有时会报The connection to adb i ...

  10. JDK 安装步骤

    1.JAVA_HOME  =  JDK安装路径 2.  Path  =  %JAVA_HOME%\bin; 3.  CLASSPATH   =  .;%JAVA_HOME%\lib\dt.jar;%J ...