首页 > 其他分享 >Day26:内部类的详解

Day26:内部类的详解

时间:2022-11-29 19:33:44浏览次数:66  
标签:Outer 内部 show void Day26 class 详解 public

内部类

1.1内部类概述

内部类:就是在一个类中定义另外一个类。

例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类。

好比我们的手机是一个类,而手机内部的零件又属于一个类。

内部类的定义格式:

/*格式:
public class 类名{
    修饰符 class 类名{
        
    }
}
*/
//范例:
public class Outer{//外部类
    public class Inner{//内部类
        
    }
}

内部类的特点:

  • 内部类可以直接访问外部类的所有成员
  • 外部类访问内部类的成员必须创建对象
public class Outer{
    private int a=10;
    public String name="工地佬";
    public void show(){
        System.out.println("外部类的方法");
    }
    
    //内部类
    public class Inner{//当内部类的修饰符为静态时,则无法访问外部类的非静态成员,因为静态成员与类共加载,而非静态成员从属于对象,时间上有所差异
        public void show(){
        System.out.println("内部类的方法");
        System.out.println("外部类的属性"+a+name);//内部类可以访问外部类的所有成员
        }  
    }
    
    //外部类访问内部类的方法必须创建内部类的对象
    public void Method(){
        Inner i=new Inner();
        i.show();
    }
    
}

1.2 内部类的种类

根据内部类所在类的位置不同,将内部类划分为以下两种形式:

  • 成员内部类:为内部类的成员位置

  • 局部内部类:为类的局部位置,也就是方法内的类


1.2.1成员内部类

当外部程序访问内部类时,如何将内部类对象实例化?

  • 当在外部访问一个类中的成员内部类时:

我们要先创建外部类的对象,再通过外部类对象再创建内部类的对象;

格式:外部类名.内部类名 类名=外部类对象.内部类;

范例:Outer.Inner i=new Outer().new Inner();

//创建一个含有成员内部类的类
public class Outer{
    private int a=10;
    public class Inner{
        public void show(){
            System.out.println(a);
        }
    }
}
//测试类
public class Test{
    public static void main(String[] args){
        //创建内部类格式
        Outer.Inner i=new Outer().new Inner();
        i,show();
    }
}

我们创建内部类其实是不想让外界直接访问,所以我们的内部类的修饰符一般不会用public,而是用private

当我们将内部类私有化后,会在外部类留有一个方法来访问内部类

public class Outer{
    private int a=10;
       /* public class Inner{
        public void show(){
            System.out.println(a);
        }我们的内部类一般不用public
    }
    */
    private class Inner{
        public void show(){
           System.out.println(a); 
        }
    }
    //在外部类中留下一个方法来访问内部类
    public void method(){
        Inner i=new Inner();
        i.show();
    }
    
}
//测试类
public class Test{
    public static void main(String[] args){
        Outer o=new Outer();
        o.method();
    }
}

1.2.2 局部内部类

  • 局部内部类是在类中方法定义的类,外界是无法直接使用的,需要在方法中创建内部类的对象方可使用
  • 局部内部类可以直接访问方法内的局部变量以及外部类的成员。
public class Outer{
    private int a=10;
    public void method(){
        int b=20;//方法中的局部变量
        class Inner{
            public void show(){
            System.out.println(a);//可以访问外部类的成员
            System.out.println(b);//可以访问方法中的局部变量
          }
        }
        Inner i=new Inner();//要访问局部内部类的成员,必须通过在外部类的方法中建立局部内部类的对象进而调用
        i.show();
    }
}
public class Test{
    public static void main(String[] args){
        /*Outer o=new Outer();
        o.method;    直接调用方法并不会将方法中的类的方法执行,因为并没有明确的指令去调用局部内部类的方法
        */
        //在方法中建立局部内部类后方可访问
        Outer o=new Outer();
        o.method; // 10  20
    }
}

1.2.2.1 局部内部类中的匿名内部类

前提:有一个类或者接口,这个类可以是普通类,也可以是抽象类。

格式:new 类名/接口名(){

重写的方法};

案例:

new Inter(){
   public void show{
        Syestem.out.println("匿名内部类输出了");
    }
);

匿名内部类也是在方法之中,其本质其实是一个继承类的子类对象或者是接口的实现类对象,只是没有名字而已。

public interface Inter{
    void show();
}
public class Outer{
    
    private int a=10;
    
    public void method{//外部类方法
        
        String name="工地佬";
        
        new Inter(){//匿名内部类,本质为实现类的对象
            public void show(){
                System.out.println("匿名内部类");
            }
        };
        //如何访问匿名内部类的方法呢?
        //既然其是一个对象,那么直接 对象.方法 调用即可
        new Inter(){
            public void show(){
                System.out.println("匿名内部类");
            }
        }.show();//匿名内部类直接.方法可以且只能调用其自身重写的方法
        //因为该匿名内部类为一个实现类对象,我们可以用多态的方式去接收这个对象
        Inter i=new Inter(){
            public void show(){
                System.out.println("匿名内部类");
            }
        };
        //然后直接用i来调用方法
        i.show();
    }
}
public class Test{
    public static void main(String[] args){
        Outer o=new Outer();
        o.method();
    }
}

标签:Outer,内部,show,void,Day26,class,详解,public
From: https://www.cnblogs.com/CQliuwei/p/16936466.html

相关文章

  • 浅谈工作与生活分离的企业内部沟通软件
    现在很多年轻员工在工作的时候很容易出现拖拉现象,工作不能够按时完成或者是在工作时间做一些自己的私事,严重影响到了工作进度,老实说,所有的企业都希望自己的员工在上班时间能......
  • Rockwell EDI 855 采购订单确认报文详解
    罗克韦尔自动化与国内12家授权分销商,124家认可的系统集成商,30多家亚太区的Encompass战略合作伙伴和全球战略联盟,共同为制造业企业提供广泛的世界一流的产品、解决方案与......
  • Redis详解(二)——AOF
    转载Redis详解(二)——AOF前言RDB持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)。对于数据完整性要......
  • Svcutil.exe详解
    补充:以下命令为客户端生成代理svcutilnet.tcp://192.168.0.100:3333/ChatService/language:C#/out:proxy.cs/config:app.config以下命令为客户端生成异步代理(设置IsOneW......
  • mvc中有关用户权限的详解
    Whenstandardtypesofauthenticationdonotmeetyourrequirements,youneedtomodifyanauthenticationmechanismtocreateacustomsolution.Ausercontex......
  • linux基础命令详解
    1ll命令输出简介类型(第一列)-:普通文件d:目录文件l:链接文件p:管理文件b:块设备文件c:字符设备文件s:套接字文件权限(第二列)三个为一组,从前往后每一组分别代表......
  • $.ajax()方法详解
    $.ajax()方法详解jquery中的ajax方法参数总是记不住,这里记录一下。 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。2.type: 要求为String类型的参......
  • xmpp即时通讯详解
    摘要:       此文档定义了可扩展消息出席协议(XMPP)的核心特性:协议使用XML元素在任意两个网络端点间近实时的交换结构化信息。当XMPP为交换XML......
  • Go 基础系列:17. 详解 20 个占位符
    Go基础系列:17.详解20个占位符学到什么什么是占位符?哪些函数支持?如何使用占位符?不同的占位符的作用?配合占位符的几个标记用法?概念什么是占位符?你就从表面意思......
  • PlantUML画类图、流程图、时序图使用详解
    程序员难免要经常画流程图,状态图,时序图等。以前经常用visio画,经常为矩形画多大,摆放在哪等问题费脑筋。有时候修改文字后,为了较好的显示效果不得不再去修改图形。今天介绍......