内部类详解

定义:将一个类定义在另一个类的内部,该类就称为内部类

类中定义的内部类特点:

  1. 内部类作为外部类的成员,可以直接访问外部类的成员

    (包括 private 成员),反之则不行。
  2. 内部类做为外部类成员,可声明为 private、默认、 protected或 public。
  3. 内部类成员只有在内部类的范围之内是有效的。
  4. 用内部类定义在外部类中不可访问的属性。这样就在外部

    类中实现了比外部类的 private 还要小的访问权限。

内部类的优缺点:

优点:内部类可以直接访问外部类的私有属性

缺点:破坏了类的结构

内部类的分类:

1) 成员内部类:内部类相当于外部类的成员

Face类:

  1. package com.bjsxt.inner;
  2. public class Face {
  3. private String shapeString="瓜子脸";
  4. public class Noise{
  5. public String shapeString="高鼻梁";
  6. public void breath(){
  7. System.out.println("鼻子长在"+shapeString+"的脸上");
  8. System.out.println("********当外部类和内部类有相同的属性时,调用外部类需要加上 外部类类名.this. ********");
  9. System.out.println("鼻子长在"+Face.this.shapeString+"的脸上");
  10. System.out.println("用鼻子在呼吸");
  11. }
  12. }
  13. }

测试类:

  1. package com.bjsxt.inner;
  2. import com.bjsxt.inner.Face.Noise;//需要导包
  3. public class TestFace {
  4. public static void main(String[] args) {
  5. //创建外部类脸的对象
  6. Face face=new Face();
  7. //创建内部类鼻子的对象(需要导包)
  8. Noise noise=face.new Noise();
  9. //调用鼻子的方法
  10. noise.breath();
  11. }
  12. }



2) 静态内部类

Outer类:

  1. package com.bjsxt.innerStatic;
  2. public class Outer {
  3. private static String name="张三";
  4. /*静态内部类 1.不允许访问外部类的非static属性。2.如果内部类的方法时static,那么内部类也不必须是static修饰*/
  5. static class Inner{
  6. public void show(){
  7. System.out.println(name);
  8. }
  9. }
  10. static class Inner2{
  11. public static void show(){
  12. }
  13. }
  14. }

测试类:

  1. package com.bjsxt.innerStatic;
  2. import com.bjsxt.innerStatic.Outer.Inner;
  3. public class TestStaticInner {
  4. public static void main(String[] args) {
  5. //创建内部类的对象(由于是静态的,所以需要 类名. 去调用)
  6. Outer.Inner inner=new Inner();
  7. inner.show();
  8. //访问的是静态内部类的静态方法。
  9. Outer.Inner2.show();
  10. }
  11. }



3) 方法中的内部类:只能在方法中使用,相当于方法中的局部变量

  1. package com.bjsxt.innermethod;
  2. public class Outer {
  3. public void show(){
  4. int a=10;
  5. class Inner{
  6. public void fun(){
  7. System.out.println("a="+a);
  8. }
  9. }
  10. //创建内部类对象
  11. new Inner().fun();
  12. }
  13. }

JDK1.8 新特性:

a) JDK1.8 之前方法中的内部类要访问外部类的局部变

量,必须加上 final 关键字 (常量)

b) JDK1.8 开始,在访问外部类的局部变量时,则可以不

加 final 关键字

匿名内部类 ( 存在继承或实现关系)

a) 可以实现一个接口,或者继承一个父类

b) 只能实现一个接口

c) 适合创建那种只需要一次使用的类,不能重复使用。

比较常见的是在图形界面编程 GUI 里用得到。

  1. package com.bjsxt.anonymous;
  2. public abstract class Father {
  3. public abstract void dream();
  4. }
  5. class Son extends Father{
  6. @Override
  7. public void dream() {
  8. System.out.println("当兵光荣");
  9. }
  10. }
  11. class Test{
  12. public static void main(String[] args) {
  13. //父类引用指向子类对象
  14. Father son=new Son();
  15. son.dream();
  16. //匿名内部类
  17. Father father=new Father()
  18. {
  19. @Override
  20. public void dream() {
  21. System.out.println("帮助父亲完成他的梦想");
  22. }
  23. };
  24. father.dream();
  25. }
  26. }

Java修炼——内部类详解的更多相关文章

  1. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  2. Java中内部类详解—匿名内部类

    什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类.   成员内部类 定义在类中方法外的类. 定义格式: class 外部类 { class 内部类{ } } ...

  3. java基础 内部类详解

    什么是内部类? 1.内部类也是一个类: 2.内部类位于其他类声明内部. 内部类的常见类型 1.成员内部类 2.局部内部类 3.匿名内部类 4.静态内部类 简单示例 /** * 外部类 * */ pub ...

  4. Java修炼——接口详解_接口的特征_使用接口的意义

    接口中可以包含的内容: 抽象法和非抽象方法(jdk1.8,必须使用default的关键字),属性(public static final)常量. 接口和类的关系 1.(继承了接口)类必须去实现接口中的 ...

  5. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  6. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  7. 【转】Java内部类详解

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  8. Java内部类详解(一)

    (转自:http://blog.csdn.net/wangpeng047/article/details/12344593) 很多人对于Java内部类(Inner Class)都十分陌生,甚至听都没听 ...

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

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

随机推荐

  1. Go 基础学习笔记 (5)| 数据类型说明与使用

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  2. LINQ学习——JOIN

    一.JOIN的作用 1.使用联接来结合两个或更多的集合的数据. 2.联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段. Note:这里是包含而不是这个原实集合的字 ...

  3. Windows7下安装Linux双操作系统

    本文链接:https://blog.csdn.net/zh175578809/article/details/78576193 最近正在学习Linux系统的常用操作命令,于是心血来潮,想自己安装一个L ...

  4. 2-了解DBMS

    1.DB,DBS,DBMS的区别是什么?     1.1 DB 就是数据库,数据库是存储数据的集合,可理解为多个数据表     1.2 DBS 数据库系统,包括数据库,数据库管理系统和数据库管理人员D ...

  5. 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号

      /** * 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号 * Created by 1 on 2015/8/19. */ public class FilterA ...

  6. nyoj 275-队花的烦恼一 (stack, push, pop)

    275-队花的烦恼一 内存限制:64MB 时间限制:3000ms 特判: No 通过数:11 提交数:14 难度:1 题目描述: ACM队的队花C小+经常抱怨:“C语言中的格式输出中有十六.十.八进制 ...

  7. 页面加载和图片加载loading

    准备放假了!也是闲着了 ,就来整理之前学到或用到的一下知识点和使用内容,这次记录的是关于加载的友好性loading!!!这里记录一下两种加载方法 1.页面加载的方法,它需要用到js里面两个方法 doc ...

  8. Elasticsearch系列---全面了解Document

    概要 本篇主要介绍一下document的知识,对document的元数据和基本的语法进行讲解. document核心元数据 前面入门实战一节有简单介绍过document数据示例,这次我们来详细了解一下 ...

  9. springboot+swagger接口文档企业实践(下)

    目录 1.引言 2. swagger接口过滤 2.1 按包过滤(package) 2.2 按类注解过滤 2.3 按方法注解过滤 2.4 按分组过滤 2.4.1 定义注解ApiVersion 2.4.2 ...

  10. 从Excel到Python:最常用的36个Pandas函数

    本文涉及pandas最常用的36个函数,通过这些函数介绍如何完成数据生成和导入.数据清洗.预处理,以及最常见的数据分类,数据筛选,分类汇总,透视等最常见的操作. 生成数据表 常见的生成数据表的方法有两 ...