zoukankan      html  css  js  c++  java
  • java中常见的几种内部类,你会几个?(未完)

    点击上方蓝色关注我们!

    大家好,我是雄雄,今天给大家介绍的是java中的几种内部类

    java中常见的几个内部类,你会几个?我会四个!

    在看每个新知识点时,我们不禁有这样或者那样的疑问,比如它是什么?怎么用?带着这些疑问我们继续往下看:

    它(内部类),是什么?

    内部类,顾名思义就是内部的类,什么的内部?我们都知道java中基本的操作单元是类,那么在类的内部还有一个类(也可以说是类中嵌套类),这样的结构,我们就可以称这种(类中的类)为内部类。

    接下来我们可以看一个简单的内部类案例,代码如下:

    package org.test;
    
    //外部类
    public class People {
    
      //外部类的方法
      public void show(String name){
        System.out.println("你好"+name);
      }
      
      //内部类
      class Peo {
        //内部类的方法
        public void show(String name){
          System.out.println("你好"+name);
        }
      }
      
      //外部类的main方法
      public static void main(String[] args) {
        //创建内部类的对象
        Peo p = new People().new Peo();
        p.show("张三");
        System.out.println("---------------");
        //调用外部类的
        new People().show("李四");
      }
    
    }

    分析一下代码,我们先写了一个外部类People,在外部类中写一个show方法,并且需要一个String类型的参数,紧接着有在该类中重新声明了一个名为Peo的类(内部类),该内部类中也写了一个show方法,且需要一个Stirng类型的参数。

    然后我们在外部类的main方法中,分别调用内部类与外部类的方法,运行结果为:

    可见,内部类的用法并不难,下面我们来深入的看看。

    java中的内部类只是java编译器的概念,对于java的虚拟机而言,它是没有java内部类的概念的,也就是说java中的内部类最后也会被编译成一个独立的class文件。

    Java中的内部类可以分为四种:

    • 静态内部类

    • 成员内部类

    • 方法内部类

    • 匿名内部类

    它(内部类)怎么用?

    1.静态内部类:

    静态内部类的声明和静态方法声明类似,就是将关键词改成了class,如下:

    package org.test;
    
    //外部类
    public class People {
      static int num;
      
      
      //内部类
      static class Peo {
        private static String name ;
        //内部类的方法
        public static void show(){
          System.out.println("数字是:"+num);
          System.out.println("欢迎关注:"+name+",嘿嘿!");
        }
      }
      
      //main方法
      public static void main(String[] args) {
        new People().num = 888;
        Peo.name = "雄雄的小课堂";
        Peo.show();
      }
    
    }

    分析代码:

    我们在外部类People中声明了一个int类型的num,在内部类中声明了name属性和show方法。然后在主体main方法中调用,其结果为:

    总结: 静态内部类可以直接访问外部的静态属性和方法,但是不可访问外部类的实例属性和方法。

    2.成员内部类:

    将静态内部类的static关键词去掉就成了成员内部类,代码如下:

    package org.test;
    
    //外部类
    public class People {
      
      private static int age ;
      String address ="山东济南";
      
      //内部类
       class Peo {
        private  String name ;
        //内部类的方法
        public  void show(){
          System.out.println("年龄是:"+age);
          System.out.println("地址是:"+address);
          System.out.println("名称是:"+name+",嘿嘿!");
          
        }
      }
      
      //main方法
      public static void main(String[] args) {
        Peo p = new People().new Peo();
        People.age = 18;
        p.name = "雄雄的小课堂";
        p.show();
      }
    
    }

    运行结果为:

    显而易见,成员内部类中除了可以调用外部类中的私有的静态属性外,还可以调用外部类的实例属性。

    下面还有一个问题,即:当外部类中的属性与内部类中的属性重名时,在内部类中如何区分使用该属性呢,代码如下:

    //外部类
    public class People {
      
      //年龄
      private static int age ;
       String address ="山东济南";
      
      //内部类
       class Peo {
         //姓名
        private  String name ;
        //年龄
        private int age = 28; //内部类和外部类重名的属性
        //内部类的方法
        public  void show(){
          System.out.println("年龄是:"+age);
          System.out.println("年龄是:"+age);
          System.out.println("地址是:"+address);
          System.out.println("名称是:"+name+",嘿嘿!");
          
        }
      }
      
      //main方法
      public static void main(String[] args) {
        Peo p = new People().new Peo();
        People.age = 18;
        p.name = "雄雄的小课堂";
        p.show();
      }
    }

    大家猜想一下age的值多少?18?28?还是一个18一个28?运行结果为:

    造成这样的结果原因是什么呢?从代码中不难看的出来,age结果的值是内部类的值,并非外部类的值,那么如果我想在内部类中使用外部类的属性,我应该如何使用呢?

    很简单,我们只需在该属性的前面加上“类名.this.属性名”即可,案例中我们就可以这样写:

    运行结果:

    今天就先分享到这里,剩余的“方法内部类”和“匿名内部类”我们明天接着讲。

    支持作者

    赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

    粉丝群

    ▲每天都会有不定额的红包发放,了解公众号文章、抽奖最新资讯。

    往期推荐

    java中你知道的这四种代码块吗?

    切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道

    浅谈我的读书史

    浅谈我的读书史(2)

  • 相关阅读:
    各种锁
    几百兆的sql文件无法编辑
    og4j1.x升级log4j2.x及异步日志开启
    TSNE/分析两个数据的分布
    _tkinter.TclError: no display name and no $DISPLAY environment variable
    split分割文件
    ubuntu+jdk
    进程操作
    ImportError: No module named apex
    Ubuntu 16.04.4安装Anaconda
  • 原文地址:https://www.cnblogs.com/a1111/p/14877426.html
Copyright © 2011-2022 走看看