• Java学习:内部类


    内部类:
    把类A定义在类B的内部,类A就被称为内部类。

    访问特点:
    A:内部类可以直接访问外部类的成员,包括私有。
    B:外部类要访问内部类的成员,必须创建对象。

    内部类分类:
    成员位置:成员内部类
    局部位置:局部内部类

    成员内部类:
    外界如何创建对象

    外部类名.内部类名 对象名 = 外部类对象.内部类对象;

    示例:

     1 class Outer3{
     2     //创建一个成员内部类
     3     class Inner3{
     4         public void show(){
     5             System.out.println("inner3的show()");    
     6         }
     7     }
     8     
     9 }
    10 
    11 public class InnerClassDemo3 {
    12     public static void main(String[] args) {
    13         //需求:创建上面的内部类对象,调用他的show方法
    14         //创建内部类对象的格式:外部类名.内部类名     对象名 = 外部类对象.内部类对象
    15         Outer3.Inner3 oi = new Outer3().new Inner3(); 
    16         oi.show();
    17     }
    18 
    19 }

    局部内部类:
    A:可以直接访问外部类的成员,包括私有
    B:在成员方法中创建局部内部类的对象,调用局部内部类的功能

    示例:

     1 class Outer{
     2     //创建一个外部类的私有化的成员变量
     3     private int num = 30;
     4     
     5     //创建一个show方法,show方法内部有一个局部内部类
     6     public void show(){
     7         //设置一个show方法的局部变量
     8         final int num2 = 40;//num2被加上final之后,num2变成了常量,其实本质上他就是40
     9         //创建局部内部类
    10         class Inner{
    11             //存在一个function方法
    12             public void function(){
    13                 System.out.println(num2);
    14                 //System.out.println(40);
    15                 //编译:java -- class
    16                 //反编译:class -- java
    17                 /**
    18                  * 问题:局部内部类的成员方法访问局部变量的时候,局部变量为什么必须加上final就不报错了呢??
    19                  * 我们的show方法在调用的时候存在于栈内存,当show方法调用完毕之后,他的局部变量num2会随着show
    20                  * 方法调用完毕二消失,但是现在存在一个问题,show方法中的局部对象不会立即从堆内存中直接释放掉,他还保留着num2,
    21                  * 此时就发生了矛盾,局部对象想使用这个num2这个变量,但是他又急着从栈内存中消失。。。,所以我们需要给num2加上final关键字
    22                  * 是他变为常量
    23                  */
    24             }
    25         }
    26         
    27         //需求:在show方法中调用局部内部类的function方法
    28         //创建局部内部类对象
    29         Inner i = new Inner();
    30         i.function();
    31     }
    32     
    33 }
    34 
    35 
    36 public class InnerClassDemo {
    37     public static void main(String[] args) {
    38         //需求:调用Outer外部类的show方法
    39         //创建外部类对象
    40         Outer o = new Outer();
    41         o.show();
    42     }
    43 
    44 }

    匿名内部类
    没有名字的局部内部类,就是内部类的简化写法

    前提:
    存在一个类或者接口
    这里的类可以是具体类也可以是抽象类。

    格式:
    new 类名或者接口名() {
    重写方法;
    };

    本质:
    是一个继承了类或者实现了接口的子类匿名对象。

    示例:

     1 interface Animal{
     2     public abstract void eat();
     3 }
     4 
     5 //创建一个外部类
     6 class Outer2{
     7     //创建一个show方法,方法中存在一个匿名内部类
     8     public void show(){
     9         //匿名内部类
    10         //匿名内部类格式:new 类或者接口(){重写的方法}
    11         //匿名内部类本质:就是一个继承了类 ,或者实现了接口 ,的子类或者实现类的匿名对象
    12         new Animal(){
    13             public void eat() {
    14                 System.out.println("动物爱吃肉");
    15             }    
    16         }.eat();
    17     }
    18 }
    19 
    20 
    21 public class InnerClassDemo2 {
    22     public static void main(String[] args) {
    23         //创建一个Outer2这个外部类对象
    24         Outer2 o2 = new Outer2();
    25         o2.show();
    26     }
    27 
    28 }
  • 相关阅读:
    解决Ubuntu下pycharm无法输入中文的问题
    爬取www.mmjpg.com网站图片,你懂得哦!
    批量查询ip地址归属地
    Opencv源码编译
    使用阿里云安装python模块
    Ansible运维自动化
    Mha-Atlas-MySQL高可用
    SVN
    Tomcat
    DHCP
  • 原文地址:https://www.cnblogs.com/shaofanglazi/p/6732225.html
Copyright © 2020-2023  润新知