内部类

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();
}
}

Day26:内部类的详解的更多相关文章

  1. 009-Scala的内部类实战详解

    009-Scala的内部类实战详解 Scala内部类详解 与java的区别 java的内部类是从属于外部类的 Scala的内部类是从属于对象的 内部类在调用方法的时候传递的内部类只能是由自己本身 欢迎 ...

  2. “全栈2019”Java第九十七章:在方法中访问局部内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. “全栈2019”Java第六十八章:外部类访问内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. Java :内部类基础详解

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { pr ...

  5. Model中内部类meta详解

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性. 以下对此作一总结: Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项 ...

  6. java内部类深入详解 内部类的分类 特点 定义方式 使用

    本文关键词: java内部类 内部类的分类 特点  定义方式 使用   外部类调用内部类 多层嵌套内部类  内部类访问外部类属性  接口中的内部类  内部类的继承  内部类的覆盖  局部内部类 成员内 ...

  7. Java基础学习(三) -- OOP的三大特征、向上和向下转型、内部类之详解

    面向对象编程(OOP)的三大特征 什么是封装? (1) 把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的类中; (2) "信息隐藏", 把不需要让外界知道的信息隐藏起来 ...

  8. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙——HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  9. “全栈2019”Java第九十六章:抽象局部内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. “全栈2019”Java第六十七章:内部类、嵌套类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. liunx标准输入与输出

    一.Linux提供了三种输入/输出通道给程序在linux中,每个进程都会有三个文件,并且这三个文件会进行重定向处理:1. 标准输入(STDIN) - 缺省为键盘2. 标准输出(STDOUT) - 默认 ...

  2. (一)JPA的快速入门

    JPA简介 JPA是什么 JPA 是Java Persistence API的缩写,是一套由Java官方制定的ORM标准.当制定这套标准以后,市场上就出现很多JPA框架.如:OpenJPA(apach ...

  3. NLP新手入门指南|北大-TANGENT

    开源的学习资源:<NLP 新手入门指南>,项目作者为北京大学 TANGENT 实验室成员. 该指南主要提供了 NLP 学习入门引导.常见任务的开发实现.各大技术教程与文献的相关推荐等内容, ...

  4. kubeoperator 使用外部mysql

    1.导出 kubeoperator 的数据库 sql 文件,然后导入到外部mysql 2.正常关闭 kubeoperator 3.关闭 kubeoperator 不会影响已经部署的 k8s 集群 4. ...

  5. PAT (Basic Level) Practice 1029 旧键盘 分数 20

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...

  6. nsis制作新版迅雷安装界面

    终于搞出来一点名堂,不借用皮肤插件,圆角,无标题栏拖动,渐隐渐显,纯nsis代码编写,相似度大概也有95%以上了. 演示程序下载

  7. 一个C#开发者学习SpringCloud搭建微服务的心路历程

    前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...

  8. 一文讲清楚 JVM Safe Point

    大家好,我是树哥. 关于 Safe Point 是 JVM 中很关键的一个概念,但我估计有不少同学不是很懂.于是今天跟大家来深入聊聊 Safe Point,希望通过这篇文章能解答这样几个问题: 什么是 ...

  9. Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

    在<基于 vite 创建 vue3 项目>一文中整合了 pinia,有不少伙伴不知道 pinia 是什么,本文简单介绍 pinia.主要包括三方面: pinia 的基本用法,在<基于 ...

  10. do-while循环的使用

    一.循环结构的4个要素 ① 初始化条件 ② 循环条件 --->是boolean类型 ③ 循环体 ④ 迭代条件 二.do-while循环结构: ①do{ ③; ④;}while(②); 执行过程: ...