zoukankan      html  css  js  c++  java
  • 解读Java内部类

    一、基本概念:

      顾名思义,内部类存在于外部类当中,依附于外部类。就像眼睛和脑袋的关系一样。

    二、几点说明:

      1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 ;
      2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 ;
      3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 ;
      4.内部类增加了代码的复杂性,有着诸多的缺点,其唯一有点就是可以访问外部类的所有成员。

    三、分类: 

      1.成员内部类:

        a).成员内部类可以看成是外部类的成员变量。

        b).非静态内部类

     1 public class Out {
     2 
     3     int age;
     4     String name;
     5     private char sex;
     6 
     7 
     8     class In {
     9 
    10         int age;
    11 
    12         public void print() {
    13             //内部类可以访问任何权限的外部类成员
    14             System.out.println("姓名为:" + name + "
    " + "性别为:" + sex);
    15         }
    16 
    17     }
    18 }
    19 
    20 class Demo {
    21 
    22     public static void main(String[] args) {
    23         //非静态内部类对象的创建必须基于外部类对象(静态成员属于类,非静态成员属于对象)
    24         Out.In in = new Out().new In();
    25         in.print();
    26     }
    27 }

        c).静态内部类

     1 public class Out {
     2 
     3     int age;
     4     String name;
     5     private char sex;
     6     static int height;
     7 
     8 
     9     static class In {
    10 
    11         int age;
    12 
    13         public void print() {
    14             //静态内部类只能访问外部类的静态变量
    15             System.out.println("身高为:" + height);
    16         }
    17 
    18     }
    19 }
    20 
    21 class Demo {
    22 
    23     public static void main(String[] args) {
    24         //静态内部类对象的创建可直接基于外部类(静态成员属于类,非静态成员属于对象)
    25         Out.In in = new Out.In();
    26         in.print();
    27     }
    28 }

        d).私有内部类

     1 public class Out {
     2 
     3     int age;
     4     String name;
     5     private char sex;
     6     static int height;
     7 
     8 
     9     private class In {
    10 
    11         int age;
    12 
    13         public void print() {
    14             System.out.println("身高为:" + height);
    15         }
    16 
    17     }
    18 }
    19 
    20 class Demo {
    21 
    22     public static void main(String[] args) {
    23         //私有内部类只能在外部类内部使用,以下代码无效
    24         /*Out.In in = new Out.In();
    25         in.print();*/
    26     }
    27 }

      2.匿名内部类:

        a).内部类只使用一次时候,则定义为匿名内部类,节省定义新类的成本

        b).匿名内部类在抽象类的实现

     1 public abstract class Animal {
     2 
     3     public abstract void eat();
     4 }
     5 
     6 class Demo {
     7 
     8     public static void main(String[] args) {
     9 
    10         Animal dog = new Animal() {
    11             @Override
    12             public void eat() {
    13                 System.out.println("狗吃骨头!!");
    14             }
    15         };
    16         dog.eat();
    17     }
    18 }

         匿名内部类不允许定义构造函数.

        c).匿名内部类在接口的实现

     1 public interface Animal {
     2 
     3     public abstract void eat();
     4 }
     5 
     6 class Demo {
     7 
     8     public static void main(String[] args) {
     9 
    10         Animal cat = new Animal() {
    11             @Override
    12             public void eat() {
    13                 System.out.println("猫吃鱼!!");
    14             }
    15         };
    16         cat.eat();
    17     }
    18 }

      3.局部内部类:

        a).局部内部类存在于方法体中,不常用

        b).基本实现

     1 public class Out {
     2 
     3     //方法传参数给局部内部类时参数定义为fianl
     4     public void outPrint(final String str) {
     5         class In {
     6             public void inPrint() {
     7                 System.out.println(str);
     8             }
     9         }
    10         new In().inPrint();
    11     }
    12 }
    13 
    14 class Demo {
    15     public static void main(String[] args) {
    16         new Out().outPrint("测试字符串!!");
    17     }
    18 }
  • 相关阅读:
    剑指 Offer 25. 合并两个排序的链表
    53. 最大子序和 动态规划
    121. 买卖股票的最佳时机
    20. 有效的括号
    centos7 常用操作
    树莓派
    golang 学习笔记
    并发 线程 进程
    连接内网问题
    Lamp 高并发优化
  • 原文地址:https://www.cnblogs.com/coderls/p/6435302.html
Copyright © 2011-2022 走看看