首页 > 编程语言 >Java内部类详解

Java内部类详解

时间:2023-12-13 10:22:59浏览次数:33  
标签:Java 内部 System 详解 println Outer public out

内部类

内部类的分类

内部类分类

  • 成员内部类

  • 静态内部类

  • 局部内部类

  • 匿名内部类

内部类的概念

在一个类里面定义一个完整的类

package com.lin.clas.demo01;

public class Body {

  //内部类
  class Head{

  }
}

成员内部类

  • 在类的内部定义,与实例变量,实例方法同级别的类。

  • 创建内部类对象的方法:

    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();

    也可以一步完成

    Outer.Inner inner = new Outer().new Inner();
  • 当外部类、内部类存在同名的变量时有限访问内部类,但是可以通过Outer.this. this.明确访问的是哪个类里的变量。

    package com.lin.clas.demo02;

    public class Outer {
       //外部类

       private String name = "Outer";
       private int age = 10;

       class Inner{
           //内部类

           private String name = "Inner";
           private String address = "Inner";
           private int phone = 20;

           //方法
           public void show(){
               //打印外部类
               System.out.println(Outer.this.name);
               System.out.println(age);

               //打印内部类
               System.out.println(this.name);
               System.out.println(address);
               System.out.println(phone);
          }
      }
    }
  • 成员内部类中不能定义静态成员,但是可以定义静态常量!

静态内部类

在成员内部类增加一个static关键字

  • 不依赖外部类对象,可以之间创建或者通过类名访问,相当于外部类。

  • 只有内部类才能使用static关键字修饰

  • 想要调用外部类的属性,先创建外部类对象

package com.lin.clas.demo03;

//外部类
public class Outer {

   private String name = "Outer";
   private int age = 10;

   //静态内部类:和外部类相同
   static class Inner{
       private String address = "Inner";
       private int phone = 20;

       //静态成员
       private static int count = 100;

       public void show(){
           //调用外部类的属性
           //1.创建外部类对象
           Outer outer = new Outer();
           //2.调用外部类对象的属性
           System.out.println(outer.name);
           System.out.println(outer.age);

           //调用静态内部类的属性和方法
           System.out.println(address);
           System.out.println(phone);
           //调用静态内部类的静态成员
           System.out.println(Inner.count);
      }
  }

}
package com.lin.clas.demo03;

public class Test {

   public static void main(String[] args) {
       //直接创建静态内部类对象
       Outer.Inner inner = new Outer.Inner();

       //调用内部类方法
       inner.show();
  }

}

局部内部类

  • 定义在外部类的方法中,作用范围和创建对象仅限于当前方法。

  • 局部内部类不能加任何访问修饰符。

  • 局部内部类访问外部类当前方法的局部变量时,因无法保证变量的生命周期和自身相同,变量必须修饰为final。

  • 限制类的使用范围,只能在当前方法中使用。

package com.lin.clas.demo04;

//外部类
public class Outer {

   private String name = "Outer";
   private int age = 10;

   //方法
   public void show(){
       //定义局部变量,相当于加了个final
       String address = "上海";

       //定义局部内部类
       //注意:不能加任何访问修饰符
       class Inner{
           //局部内部类的属性
           private String phone = "155646646";
           private String email = "[email protected]";

           //不能包含静态成员
           //private static int count = 100;
           
           public void show2(){
               //访问外部类的属性:方法不是静态的可以直接访问,静态的通过对象访问
               System.out.println(name);
               System.out.println(age);
               System.out.println(Outer.this.name);
               System.out.println(Outer.this.age);

               //访问内部类属性
               System.out.println(this.phone);
               System.out.println(this.email);

               //访问局部变量,jdk1.7之后,必须加final(常量),jdk1.8之后可以不加
               System.out.println(address);
               //相当于
               System.out.println("上海");
          }
      }

       //创建局部内部类对象
       Inner inner = new Inner();
       inner.show2();
  }

}
package com.lin.clas.demo04;

public class Test {

   public static void main(String[] args) {
       Outer outer = new Outer();

       //通过外部类对象,调用外部类方法,里面间接使用内部类H
       outer.show();
  }

}

匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)

  • 必须继承一个父类或实现一个接口

  • 定义类,实现类,创建对象的语法合并,只能创建一个该类的对象。

  • 优点:减少代码量

  • 缺点:易读性不高

package com.lin.clas.demo05;

//接口
public interface Usb {
   //方法
   void service();
}
package com.lin.clas.demo05;

public class Mouse implements Usb{

   @Override
   public void service() {
       System.out.println("鼠标开始工作了");
  }
}
package com.lin.clas.demo05;

public class TestUsb {

   public static void main(String[] args) {
       //创建接口类型变量
       Usb usb = new Mouse();
       usb.service();

       System.out.println("----------");

       //局部内部类,实现接口
       class KeyBoard implements Usb{

           @Override
           public void service() {
               System.out.println("键盘开始工作了");
          }

      }

       //使用局部内部类创建对象
       Usb usb2 = new KeyBoard();
       usb2.service();

       System.out.println("----------");


       //使用匿名内部类优化(相当于创建了一个局部内部类)
       Usb usb3 = new Usb() {
           @Override
           public void service() {
               System.out.println("键盘开始工作了");
          }
      };
       usb3.service();
  }

}
 

标签:Java,内部,System,详解,println,Outer,public,out
From: https://www.cnblogs.com/PaiAL/p/17898459.html

相关文章

  • Javascript文件上传
    什么是文件上传文件上传包含两部分,一部分是选择文件,包含所有相关的界面交互。一部分是网络传输,通过一个网络请求,将文件的数据携带过去,传递到服务器中,剩下的,在服务器中如何存储,那就与前端无关了。制作文件上传相关的功能时,一定要先确保文件上传的接口可用,否则之后会遇到无数的麻烦,无......
  • Unity3D 第一人称角色控制器,第一人称相机,摄像机的关系详解
    Unity3D是一款强大的游戏开发引擎,可以用于创建各种类型的游戏。在游戏中,第一人称角色控制器、第一人称相机和摄像机是密切相关的组件,它们共同协作来实现游戏的第一人称视角。下面将详细解释它们之间的关系,并给出代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游......
  • Java 枚举传参获取值
    平常常用的根据传参获取枚举值publicenumSaleTypeStrEnum{JX,//OTHERS;publicstaticSaleTypeStrEnumgetByName(StringsaleTypeStr){for(SaleTypeStrEnumvalue:SaleTypeStrEnum.values()){if(value.name().equals(saleTypeStr)){re......
  • JavawebDay2JavaScript
      1.脚本:不用经过编译2.与Java语言完全不同但是基础语法类似一:js引入方式   第一种:   第二种  1*alert:当进入文档时会跳出一个警告框。suchas:二:js基础语法    1书写语法   2输出语句window.可以省略三:基础语法1变量   var特点:a:......
  • 头歌——HBase 开发:使用Java操作HBase
    第1关:创建表题目任务描述本关任务:使用Java代码在HBase中创建表。相关知识为了完成本关任务,你需要掌握:1.如何使用Java连接HBase数据库,2.如何使用Java代码在HBase中创建表。如何使用Java连接HBase数据库Java连接HBase需要两个类:HBaseConfigurationConnectionFactoryHBas......
  • 无涯教程-Java - for 语句函数
    for循环是一种重复控制结构,可让您有效地编写需要执行特定次数的循环。for-语法for(initialization;Boolean_expression;update){//Statements}for-示例以下是Java中for循环的示例代码。publicclassTest{publicstaticvoidmain(Stringargs[]){......
  • Java变量
    JAVA变量局部变量:必须声明和初始化值作用域在方法体内类变量:也叫静态变量static作用域:在整个类中实例变量:作用域:在整个类中常量:publicclassDemo01{​  //常量final  staticfinaldoublePI=3.14;​  //类变量也叫静态变量static作用域:在整个类中......
  • 异常详解
    异常详解异常体系结构Java把异常当成一个对象处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。在JavaAPI中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception. 捕获和抛出异常关键字:try,catch,throw,throwspackagecom.paial.demo09......
  • Java方法详解
    Java方法详解1.何为方法类似于其他语言的函数Java方法是语句的集合,共同完成一个功能设计方法的原则:一个方法实现一个功能,有利于后期的管理和拓展!命名:首小写+驼峰命名。2.方法的定义修饰符返回值类型方法名(参数类型参数名){​方法体return返回值;}实参:实......
  • 使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
    由于macOS下的应用程序结构导致了CEF这样的多进程架构程序在项目结构、运行架构上有很多细节需要关注,这一块的内容比起Windows要复杂的多,所以本文将会聚焦macOS下基于CEF的多进程应用架构的环境配置,并逐一说明了CMake的相关用法和CEF应用配置细节。前言在进行搭建之前,我们首先必......