内部类

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. 如何在JavaScript中使用高阶函数

    将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...

  2. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  3. 类似微信聊天小程序-网易云信,IM DEMO小程序版本

    类似微信聊天小程序-网易云信,IM DEMO小程序版本 代码地址: https://github.com/netease-im/NIM_Web_Weapp_Demo 云信IM DEMO 小程序版本 ( ...

  4. Elasticsearch 数据建模指南

    文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...

  5. 分布式文件存储 CephFS的应用场景

    块存储 (适合单客户端使用) 典型设备:磁盘阵列,硬盘. 使用场景: a. docker容器.虚拟机远程挂载磁盘存储分配. b. 日志存储. 文件存储 (适合多客户端有目录结构) 典型设备:FTP.N ...

  6. 彻底掌握Makeifle(三)

    彻底掌握Makeifle(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一 ...

  7. .Net 7 C#11 原始字符串

    .Net7 的到来的同时,也带来了 C# 11,而令我最期待的就是 C# 11 的 原始字符串了,当我知道这个的时候,简直比过年还要开心. 非原始字符串 首先我们看看现在写字符串的方式 var str ...

  8. PAT (Basic Level) Practice 1021 个位数统计 分数 15

    给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定 N= ...

  9. 计算机三大硬件和操作系统以及python解释器

    今日分享内容概要 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展历史 编程语言的分类 python解释器 python解释器多版本共存 分享详细 计算机五大组成部 ...

  10. P1886 滑动窗口 /【模板】单调队列 方法记录

    原题链接 滑动窗口 /[模板]单调队列 题目描述 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最 ...