一、内部类

内部类

// 内部类有四种类型
// 1-非静态内部类
// 2-静态内部类
// 3-匿名类
// 4-本地类

1、非静态内部类

package ia10_innerClass;public class Hero {private String name;protected float hp;protected int armor;protected int moveSpeed;// 非静态内部类class BattleScore {private int kill;public void legendary() {if (kill >= 8) {System.out.println(name + "已超神!");} else {System.out.println(name + "还未超神!");}}public int getKill() {kill = 10;return kill;}}public static void main(String[] args) {Hero h = new Hero();h.name = "garen";// --实例化内部类// 实例化内部类必须建立在外部类实例的基础上。// 非静态内部类可以访问外部类,private修饰也可访问。// BattleScore必须建立在有一个Hero的基础上,没有英雄,何来战绩?// --访问方式// new Hero().new BattleWin();// new OuterClass().new InnerClass();BattleScore bW = h.new BattleScore();bW.kill = 9;bW.legendary();System.out.println(new Hero().new BattleScore().getKill());}
}

运行结果:

2、静态内部类

package ia10_innerClass2;public class Hero {public String name; // 英雄名称protected float hp; // 血量private static void battleWin() {System.out.println("hero battle win");}// 静态内部类 static修饰static class EnemyCrystal {int hp = 5000;public void CheckIfVictory() {if (hp == 0) {Hero.battleWin();// System.out.println(name + "win!"); // 不能访问name}}}public static void main(String[] args) {// --静态内部类// 静态内部类实例化,不需外部类的实例。// 因为静态内部类没有外部类实例,所有静态内部类不能访问外部类。// --访问方法// new 外部类.内部类();// 实例化静态内部类Hero.EnemyCrystal ec = new Hero.EnemyCrystal();ec.hp = 0;ec.CheckIfVictory();}
}

运行结果:

3、匿名类

package ia10_innerClass3;public abstract class Hero {protected String name;protected float hp;protected int armor;protected int moveSpeed;public abstract void attack();public static void main(String[] args) {// 匿名类// 声明一个类时实例化// 使用接口/抽象类,必须有子类实现// 直接实例化,并实现抽象方法,是一个新的类,但没有名字,即匿名类Hero h = new Hero() {@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("进行攻击");}};h.attack();System.out.println(h); // Hero$1是系统自动分配的类名ADHero ad = new ADHero();ad.attack();System.out.println(ad);}
}

运行结果:

4、本地类

package ia10_innerClass4;public abstract class Hero {protected String name;protected float hp;protected int armor;protected int moveSpeed;public abstract void attack();public static void main(String[] args) {// 本地类// 有名字的匿名类class RealHero extends Hero {@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.println("进行强烈攻击");}}RealHero rh = new RealHero();rh.attack();System.out.println(rh);}
}

运行结果:

匿名类–敲黑板
// 匿名类外部的局部变量必须为final变量

package ia10_innerClass5;public abstract class Hero {protected String name;protected float hp;protected int armor;protected int moveSpeed;public abstract void attack();public static void main(String[] args) {final int damage = 10;Hero h = new Hero() {@Overridepublic void attack() {// TODO Auto-generated method stubSystem.out.printf("进行攻击,造成%d的伤害",damage);}};h.attack();}
}

运行结果:

// 匿名类外部的局部变量为什么是final变量?

package ia10_innerClass6;public abstract class Hero {public abstract void attack();public static void main(String[] args) {// --在匿名类中使用外部的局部变量damage 必须修饰为final// --此处使用 本地类AnonymousHero 模拟匿名类 的隐藏属性机制// 事实上的匿名类,会在匿名类里声明一个damage属性,并且使用构造方法初始化该属性的值// 在attack中使用的damage,真正使用的是这个内部damage,而非外部damage// 假设外部属性不需要声明为final// 那么在attack中修改damage的值,就会被暗示为修改了外部变量damage的值// 但是他们俩是不同的变量,是不可能修改外部变量damage的// 所以为了避免产生误导,外部的damage必须声明为final,"看上去"就不能修改了// --区分匿名类外部变量和内部属性// 匿名类、本地类中如果外部变量和内部属性同名,在它们内部根本不可能访问到外部变量int damage = 5;class AnonymousHero extends Hero {int damage;public AnonymousHero(int damage) {this.damage = damage;}@Overridepublic void attack() {// TODO Auto-generated method stubdamage = 10; // 内部damage属性,而非外部局部变量System.out.printf("进行攻击,造成%d的伤害", this.damage);}}Hero h = new AnonymousHero(damage);h.attack();}
}

运行结果:

二、内部类 VS 匿名类

// 匿名类、本地类,声明在代码块中,如方法,for,if等。
// 内部类,声明在和类属性/方法同等位置。

三、练习

创建Item类的匿名类,抽象方法为返回布尔值disposable(),匿名类实现抽象方法。

内部类进阶(网上资料):https://blog.csdn.net/gaoyong_stone/article/details/79556287
我的学习源泉:https://how2j.cn/k/interface-inheritance/interface-inheritance-inner-class/322.html?p=114999
Java自学网站:https://how2j.cn?p=114999

每日学习-Java基础(十)接口和继承10(内部类)相关推荐

  1. 261、Java基础38 - 接口与继承【对象转型】 2019.11.18

    0.目录 1.明确引用类型与对象类型的概念 2.子类转父类(向上转型) 3.父类转子类(向下转型) 4.没有继承关系的两个类,互相转换 5.实现类转换成接口(向上转型) 6.接口转换成实现类(向下转型 ...

  2. JAVA基础之接口与继承

    在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击 这时候,就可以使用接口来实现这个效果. 接口就像是一种约定,我们约定某些英雄是物理系英雄,那么他们就一定能够进行物理攻 ...

  3. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的&q ...

  4. 学习Java的十大理由,益处太多了

    Java应该是软件开发同学最熟悉的一种开发语言,古老但很流行,再加上现在大数据发展形势一片大好,更让Java的魅力十足.Java是任何人都会掌握的最基本的编程语言之一,因此简单.然而,使用Java开发 ...

  5. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  6. 学习 Java 8 - 函数式接口 Lambda

    学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...

  7. JavaScript学习(五十二)—继承、call方法和apply方法

    JavaScript学习(五十二)-继承.call方法和apply方法 学习内容 一.继承 二.call方法 三.apply方法 一.继承 所谓继承就是两个构造方法建立起来的某种联系,通过某种联系,可 ...

  8. 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化

    [重难点][Java基础 07]变量类型.内部类.处理器指令优化 文章目录 [重难点][Java基础 07]变量类型.内部类.处理器指令优化 一.变量类型 1.对比 二.内部类 1.介绍 三.处理器指 ...

  9. Java实验之接口与实现、内部类与异常类

    Java实验之接口与实现.内部类与异常类 Java实验之接口与实现 评价成绩 体操比赛计算选手成绩的办法是去掉一个最高分和最低分后再计算平均分,而学校考 察一个班级的某科 目的考试情况时,是计算全班同 ...

最新文章

  1. 解决Pycharm中SystemError报错
  2. SQL与NoSQL区别-存储方式
  3. 创建零填充JavaScript数组的最有效方法?
  4. python的django框架与springboot_Django框架简介
  5. BPF、eBPF、XDP 和 Bpfilter……这些东西是什么?
  6. 使用ASP.NET Core 3.x 构建 RESTful API - 3.1 API资源命名
  7. [luoguP1849] [USACO12MAR]拖拉机Tractor(spfa)
  8. 中怎样载入选区_PS----关于选区的选取
  9. 使用base标签后图片无法加载_Spring 源码学习(二)-默认标签解析
  10. 详述人工智能在自动驾驶中的应用
  11. VSCode python extension loading 终极解决方案
  12. 屌丝c++语言程序设计第二章 c++语言基础
  13. Python使用Win32和天行机器人API实现微信自动聊天机器人(自动敷衍机器人)
  14. ubuntu 从刷机到yolov5环境搭建训练记录
  15. jsp+sql毕业生招聘系统免费系统+论文
  16. 计算机数据采集处理系统使用方法,数据采集与处理系统的要求
  17. 项目中加入百度联盟广告。
  18. CheckBox的使用
  19. Arch Linux下解决zip解压乱码的方法
  20. 【程序设计】日期和时间

热门文章

  1. 五子棋PVP项目总结
  2. 你可能没听过的11个Python库
  3. iOS开发之3DTouch集成
  4. 拉取 gcr.io 镜像,如 Kubernetes,istio 等
  5. 大数据在金融行业中的应用
  6. 相机对焦、标定等近期学习
  7. NVIDIA安装驱动不成功的解决方式
  8. win10安装python详细过程
  9. Unity特效基础:粒子效果面板
  10. Linux学习笔记(四)Linux基础操作