Java十分钟精通内部类的使用

内部类:

其实内部类顾名思义,就是类中类,一个类里面还有一个类。

内部类分为四种:

  • 普通内部类
  • 静态内部类
  • 方法内部类
  • 匿名内部类

我们一一去了解一下~~

A、普通内部类:

我们先通过代码去了解一下:

package InternalClass;

/**
 * 内部类
 */

public class Car {

    public int a = 10;
    public int b = 20;

    //外部类的方法
    public void method() {
        System.out.println("我是外部类Car的普通方法!");
        bus b = new bus();     //创建内部类的对象
        b.internalMethod();
    }

    //内部类(在Car类中的bus类)
    public class bus {
        int b = 30;

        //内部类方法
        public void internalMethod() {
            System.out.println("**这是bus内部类的普通方法!");
            System.out.println("**我是内部类,现在在访问外部类Car的a:" + a);
            System.out.println("**我是内部类,现在在访问内部类bus的b:" + this.b);
            System.out.println("**我是内部类,现在在访问外部类bus的b:" + Car.this.b);
            //注意,如果在内部类需要使用外部类的属性,必须通过外部的类去this外部类的属性

        }
    }    

	//程序运行入口:
	public static void main(String[] args) {
	    Car car = new Car();   //创建外部类的对象
	    car.method();
	    // 运行上面的代码 会输出 : 我是外部类Car的普通方法!

	   	//运行内部类的方法
	   	//在上面method方法中已经创建了内部类bus的对象b
	   	//这里就是通过使用外部类Car的对象car去new一个内部类对象
	   	bus b = car.new bus();
	   	//通过内部类对象b 去使用方法即可
	    b.internalMethod();
   }
}

//输出:
/*
**这是bus内部类的普通方法!
**我是内部类,现在在访问外部类Car的a:10
**我是内部类,现在在访问内部类bus的b:30
**我是内部类,现在在访问外部类bus的b:20

*/

B、静态内部类:

静态内部类顾名思义也是把内部类用static修饰变为静态的,可以直接用外部类类名去调用,不需要创建对象:

package InternalClass;

public class Person {

    String name = "小王";
    static int age = 20;

    //创建静态内部类
    public static class Student{

        String name = "小红";

        //静态内部类的方法
        public static void study(){

            Person p = new Person(); //创建外部类的对象

            //静态访问非静态需要使用对象去调用
            System.out.println("内部类静态方法访问外部非静态成员:"+p.name);
            System.out.println("内部类静态方法访问外部静态成员:"+Person.age);
            System.out.println("内部类静态方法访问内部非静态成员:"+new Student().name);

        }
    }

    //程序运行入口
    public static void main(String[] args) {
        //静态内使用方法不需要创建对象
        Student.study();

    }

}

/*
输出:
内部类静态方法访问外部非静态成员:小王
内部类静态方法访问外部静态成员:20
内部类静态方法访问内部非静态成员:小红
*/

C、方法内部类:

方法内部类顾名思义也是在外部类的方法体内新建一个类:

package InternalClass;

/**
 * 方法内部类
 */

public class Student {

    //方法
    public void study(){
        int age = 20;
        String name = "小王";

        //在方法内写类:方法内部类
        class child{

            //方法内部类的方法
            public void play(){
                System.out.println("孩子喜欢玩!");

            }
        }

        //在外部类study的方法内创建一个生成内部类child的对象,并使用方法
        child c = new child();
        c.play();

    }

    //程序执行入口
    public static void main(String[] args) {
        Student stu = new Student();
        //这里调用study方法后,在study方法体内创建了child的对象和调用了play的方法
        stu.study();
    }
}

//输出:我叫:小王我今年:20我爱学习
// 孩子喜欢玩!

内部类的小结(有很多局限性,所以应该注意使用场景):

  • 类前不能有访问修饰符
  • 只能在此方法内使用
  • 无法创造静态信息
  • 可以直接访问方法内的局部变量和参数,但是不能修改
  • 可以随意的访问外部类的任何信息

D、匿名内部类:

匿名内部类就是没有名字的内部类: 先定义一个接口:

public interface USB {

    void read();
}
package InternalClass;

/**
 * 匿名内部类
 */

public class Child {

    public static void main(String[] args) {

        USB u = new USB() {
            @Override
            public void read() {
                System.out.println("这是匿名内部类,是USB接口没有具名的子类,必须重写 接口做具体实现");

            }

        };
        u.read();
    }

}

匿名内部类需要注意的四点:

  • 匿名内部类不能定义任何静态成员、方法
  • 匿名内部类中的方法不能是抽象的
  • 匿名内部类必须实现接口或抽象父类的所有抽象方法
  • 匿名内部类访问的外部类成员变量或成员方法必须用static修饰

内部类的总结:

一、为什么要用内部类?

内部类拥有类的基本特征:可以继承父类,实现接口,在实际问题中我们会遇到一些接口无法解决的问题,此时我们可以使用内部类继承某个具体的或抽象的类,间接解决类无法多继承引起的一系列问题。

二、内部类的好处:

  • 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立
  • 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体
  • 内部类提供了更好的封装,除了该外围类,其他类都不能访问
  • 创建内部类对象的时刻并不依赖于外围类对象的创建

到此这篇关于Java十分钟精通内部类的使用的文章就介绍到这了,更多相关Java 内部类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java的内部类总结

    目录 前言 一,成员内部类 1,成员内部类的特点 2,成员内部类的实现 3,内部类和外部类的关系 二,静态内部类 1,静态内部类的特点 2,比较成员内部类和静态内部类 3,静态内部类的实现 三,方法内部类 1,方法内部类的特点 2,方法内部类的实现 四, 匿名内部类 1,匿名内部类的特点 2,匿名内部类的实现 总结 前言 最近看了内部类后,总结一下,首先内部类嵌套在其他内部的类,根据出现的位置和关键字,可以分为以下四种类:成员内部类,静态内部类,方法内部类,匿名内部类,接下来就介绍下这四种类,记

  • 学生视角带你了解Java内部类

    目录 一.内部类介绍 二.成员内部类: 1.非静态内部类 2.静态内部类 二.局部内部类: 2.有名的局部内部类 1.匿名局部内部类(重要) 一.内部类介绍 1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部类(inner class),嵌套其他类的称为外部类(outer class).内部类是类的五大成员之一(属性. 方法.构造器.代码块.内部类). 分类: 二.成员内部类: 1.非静态内部类 说明:定义在成员位置中(方法或代码块外面),无static修饰. 1.可以直接访问外部类的所有的

  • 详解Java匿名内部类

    匿名内部类: 先举个例子吧,给大家看一下什么是匿名内部类,Endeavor刚刚接触的时候,觉得哇哦,好奇怪的样子,这也太别扭了吧,不知道大家是什么感觉. 为了进行对比,先举一个正常的类方法调用的例子(大家应该都看的懂吧): 输出结果为: 接下来便开始说正题吧,匿名内部类,通过名字,想必大家就知道什么是匿名内部类了吧, 1.定义:就是没有名字的内部类(内部类之前介绍过了哦). 2.使用内部类有什么好处呢,一句话就概括了:简化书写,至于是怎么简化的,哪里简化了等下再说. 3.先说一下什么时候使用匿名

  • Java中内部类的概念与分类详解

    目录 内部类概念 内部类的分类: 成员内部类 普通内部类 静态内部类 局部内部类 总结 只能使用修饰限定符:public 和 默认 来修饰类 内部类概念 在 Java 中,将一个类定义在另一个类的内部,称为内部类 就是在一个类内部进行其他类结构的嵌套操作 内部类也是封装的一种体现 举例: //外部类 public class OutClass { //内部类 class InnerClass{ } } 注意:内部类和外部类共享一个 java源文件,但是经过编译之后,会形成各自单独的字节码文件 内

  • java的内部类和外部类用法讲解

    目录 一.为何使用内部类 二.内部类与外部类的联系 2.1 内部类是一个相对独立的实体,与外部类不是is-a关系 2.2 内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素 2.3 外部类可以通过内部类引用间接访问内部类元素 三.创建内部类 3.1 在外部类外面(或外部类main方法)创建内部了对象 3.2 在外部类里面创建内部类 四.内部类的种类: 4.1 成员内部类 4.2 方法内部类 4.3 匿名内部类 4.4 静态内部类 一.为何使用内部类 内部类提供了更好的封装,只有

  • 全面探究 Java 内部类

    目录 一. 实例内部类 1. 定义 2. 如何获取实例内部类这个对象的引用 3. 注意事项 二. 静态内部类 1. 定义 2. 如何获取静态内部类这个对象的引用 3. 注意事项 三. 匿名内部类 1. 定义 2. 常见用法 3. 注意事项 内部类(inner class)是定义在另一个类中的类.为什么要使用内部类呢?主要有两个原因:1.内部类可以对同一个包中的其他类隐藏.2.内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据. 下面,我就来带领大家去学习Java中比较常见的几种内部

  • Java 内部类的定义与范例

    目录 一.前言 二.内部类 语法格式: static修饰内部类 内部类未被static修饰时: 内部类被static修饰后 演示操作: 一.前言 前面我们学习了一个小的项目,现在我们来学习新的知识点,关于内部类的描述,其实 顾名思义就是在类的内部有一个类,简称套娃类(个人观点) 二.内部类 一个类定义在另一个在一个类的内部叫内部类. 内部类可以直接访问外部类的私有和非私有成员,而外部类不能直接访问内部类 (包括所有外部类成员) 外部类成员要访问内部类是,必须创建内部类对象. 外部类通过创建对象也

  • 新手初学Java的内部类

    目录 Java的内部类 成员内部类 静态内部类 局部内部类 总结 Java的内部类 概念: 内部类就是在一个类的内部定义一个类,比如,A类中定义一个B类,那么B类相对于A类来说就是称为内部类,而A类相对于B类来说就是外部类. 成员内部类 静态内部类 局部内部类 匿名内部类 特点: 内部类编译之后可以生成独立的字节码文件. 内部类可以直接访问外部类的私有成员,而不破坏封装. 内部类可为外部类提供必要的内部功能组件. 外部类要访问内部类的成员,必须要建立内部类的对象 成员内部类 在内的内部定义,与实

  • Java十分钟精通内部类的使用

    内部类: 其实内部类顾名思义,就是类中类,一个类里面还有一个类. 内部类分为四种: 普通内部类 静态内部类 方法内部类 匿名内部类 我们一一去了解一下~~ A.普通内部类: 我们先通过代码去了解一下: package InternalClass; /** * 内部类 */ public class Car { public int a = 10; public int b = 20; //外部类的方法 public void method() { System.out.println("我是外部

  • Java十分钟精通类 封装 继承

    目录 什么是类成员 什么是实例变量 那么实例变量和类变量的区别呢? 那么类方法和实例方法的区别? static关键字 static成员方法: static用处: 封装: 封装的概念 封装的分类 封装的使用 继承: 什么是继承 继承的使用: 方法重写的规则: super关键字: 什么是类成员 使用static修饰的成员方法和成员变量称为类成员 使用static修饰的成员变量叫做类变量 使用static修饰的成员方法叫做类方法 什么是实例变量 未使用static修饰的成员方法和成员变量称为实例成员

  • Java十分钟精通反射机制原理

    什么是反射? 反射机制是在运行状态中,它为Java提供一种"操作对象"的能力,在运行状态下,通过Class文件对象,可以调用到任何类里面的属性.方法.以及构造方法,包括私有的,所有的类在反射机制面前都是透明的 自己的概括:通过Class文件对象可以看到这个类里面的所有东西,并且可以使用和修改 反射的前提是获取Class文件对象((字节码对象),那么一共有三种方式获取: Class.forName("全类名") ----通过Class类的静态方法(最常用) 类名.cl

  • Java十分钟精通集合的使用与原理上篇

    目录 什么是集合? 集合分为Collection和Map两种体系 一.Collection接口: 二.Map接口下分为HashMap和TreeMap: 集合总结: Collections工具类: 什么是集合? 比如我们去买超市买很多东西,我们不可能拿一样就去收银台,我们可能是先放到购物车内,然后再统一处理,所以购物车相当于一个容器,可以装很多东西,在Java中的集合也是相当于一个容器,可以装很多数据. 集合继承关系图: 但是这张图太复杂了,我们看一张简便的: 集合分为Collection和Map

  • Java十分钟精通集合的使用与原理下篇

    List集合: ArrayList: 底层是数组结构,储存有序并且可以重复的对象 package SetTest; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ArrayListTest { public static void main(String[] args) { //创建ArrayList的对象 List<Integer> list = ne

  • Java十分钟精通Log4j日志的使用

    目录 为什么要用日志? 下载: 详细步骤: 一.打开IDEA 二.创建日志对象 为什么要用日志? 我们知道,程序在运行过程中会产生很多很多信息,比如在几点几分的时候运行了,运行的结果是怎么样的?为了我们更加了解程序运行的情况,可以通过日志来查看,日志可以在控制台输出,也可以输出至指定的文件内,在下面的文章中具体的给大家介绍. 下载: Log4J是Apache公司的开源项目,用于日志处理.下载地址: https://logging.apache.org/log4j/2.x/download.htm

  • Java十分钟精通异常处理机制

    目录 异常处理机制的底层原理 异常的继承关系图 异常的处理 一.try-catch-finally结构 二.多catch处理不同的异常: 三.throws声明异常/throw抛出异常: 四.自定义异常: 五.常见的异常 异常处理机制的底层原理 抛出异常,在执行一个方法时,如果发送了异常,则这个方法生成代表该异常的一个对象,停止当前执行的 路径,并把异常提交给jre. 捕获异常:jre得到该异常后,虚招相应的代码来处理该异常.jre在方法的调用栈中查找,从生成异常的 方法开始回溯,直到找到相应的异

  • Java十分钟精通包装类的使用与操作

    包装类 何为包装类? 基本类型包装类的概述: 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 包装类是将基本数据类型的值包装为Java中的对象,Java语言为8种基本数据类型分别提供了包装类 首先看一下八大数据类型的包装类: 包装类型出现的原因: 因为Java是一个面向对象的语言,基本类型并不具有对象的性质,为了与其他对象"接轨"就出现了包装类型,它相当于将基本类型"包装起来",使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本

  • Java十分钟精通String类的各种使用方法

    String String类: 代表字符串,提供了开发中常用的字符串处理的方法,如:求字符串的长度.截取字符串.替换字符串等方法,符串是常量,它的值创建之后就不可以再修改了. 首先我们先查一下官方文档,看看官方给String类定了什么方法: String也是属于java.lang包,所以不需要导入,这里就部分展示,全部的内容可以参考: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.htm

  • Java十分钟精通接口的使用与原理

    何为接口? 官方解释: Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 个人理解解释: 其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成.接口是解决Java无法使用多继承的一种手段.我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法.反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重

随机推荐