Java 内部类

内部类分为四种:

非静态内部类 静态内部类 匿名类 本地类

步骤 1 : 非静态内部类

非静态内部类 BattleScore “战斗成绩”

非静态内部类可以直接在一个类里面定义

比如:

战斗成绩只有在一个英雄对象存在的时候才有意义

所以实例化BattleScore 的时候,必须建立在一个存在的英雄的基础上

语法: new 外部类().new 内部类()

作为Hero的非静态内部类,是可以直接访问外部类的private实例属性name的

package charactor;public class Hero {private String name; // 姓名float hp; // 血量float armor; // 护甲int moveSpeed; // 移动速度// 非静态内部类,只有一个外部类对象存在的时候,才有意义// 战斗成绩只有在一个英雄对象存在的时候才有意义class BattleScore {int kill;int die;int assit;public void legendary() {if (kill >= 8)System.out.println(name + "超神!");elseSystem.out.println(name + "尚未超神!");}}public static void main(String[] args) {Hero garen = new Hero();garen.name = "盖伦";// 实例化内部类// BattleScore对象只有在一个英雄对象存在的时候才有意义// 所以其实例化必须建立在一个外部类对象的基础之上BattleScore score = garen.new BattleScore();score.kill = 9;score.legendary();}}

步骤 2 : 静态内部类

在一个类里面声明一个静态内部类

比如敌方水晶,当敌方水晶没有血的时候,己方所有英雄都取得胜利,而不只是某一个具体的英雄取得胜利。

与非静态内部类不同,静态内部类水晶类的实例化 不需要一个外部类的实例为基础,可以直接实例化

语法:new 外部类.静态内部类();

因为没有一个外部类的实例,所以在静态内部类里面不可以访问外部类的实例属性和方法

除了可以访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别

package charactor;public class Hero {public String name;protected float hp;private static void battleWin(){System.out.println("battle win");}//敌方的水晶static class EnemyCrystal{int hp=5000;//如果水晶的血量为0,则宣布胜利public void checkIfVictory(){if(hp==0){Hero.battleWin();//静态内部类不能直接访问外部类的对象属性System.out.println(name + " win this game");}}}public static void main(String[] args) {//实例化静态内部类Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();crystal.checkIfVictory();}}

步骤 3 : 匿名类

匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练

通常情况下,要使用一个接口或者抽象类,都必须创建一个子类

有的时候,为了快速使用,直接实例化一个抽象类,并“当场”实现其抽象方法。

既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。

这样的类,叫做匿名类

package charactor;public abstract class Hero {String name; //姓名float hp; //血量float armor; //护甲int moveSpeed; //移动速度public abstract void attack();public static void main(String[] args) {ADHero adh=new ADHero();//通过打印adh,可以看到adh这个对象属于ADHero类adh.attack();System.out.println(adh);Hero h = new Hero(){//当场实现attack方法public void attack() {System.out.println("新的进攻手段");}};h.attack();//通过打印h,可以看到h这个对象属于Hero$1这么一个系统自动分配的类名System.out.println(h);}}

步骤 4 : 本地类

本地类可以理解为有名字的匿名类

内部类与匿名类不一样的是,内部类必须声明在成员的位置,即与属性和方法平等的位置。 本地类和匿名类一样,直接声明在代码块里面,可以是主方法,for循环里等等地方

package charactor;public abstract class Hero {String name; //姓名float hp; //血量float armor; //护甲int moveSpeed; //移动速度public abstract void attack();public static void main(String[] args) {//与匿名类的区别在于,本地类有了自定义的类名class SomeHero extends Hero{public void attack() {System.out.println( name+ " 新的进攻手段");}}SomeHero h  =new SomeHero();h.name ="地卜师";h.attack();}}

步骤 5 : 在匿名类中使用外部的局部变量

在匿名类中使用外部的局部变量,外部的局部变量必须修饰为final

为什么要声明为final,其机制比较复杂,请参考第二个Hero代码中的解释

注:在jdk8中,已经不需要强制修饰成final了,如果没有写final,不会报错,因为编译器偷偷的帮你加上了看不见的final

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

80070583类不存在_Java自学-接口与继承 内部类相关推荐

  1. java 继承和内部类_Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接 ...

  2. java中继承内部类的方法_Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

  3. java final 接口_Java自学-接口与继承 final

    Java的修饰符final final修饰类,方法,基本类型变量,引用的时候分别有不同的意思. 示例 1 : final修饰类 当Hero被修饰成final的时候,表示Hero不能够被继承 其子类会出 ...

  4. 学习笔记二:接口与继承(内部类)

    学习笔记参考来源 java学习路线-推荐链接:java-接口与继承-内部类 学习笔记难免出错 望多指正!!! 什么是内部类呢? 什么是内部类?定义很简单 内部类就是定义在另一个类中的类 内部类的分类 ...

  5. java 类的重载_Java自学-类和对象 方法重载

    什么是Java 方法重载 方法的重载指的是方法名一样,但是参数类型不一样 步骤 1 : attack方法的重载 有一种英雄,叫做物理攻击英雄 ADHero 为ADHero 提供三种方法 public ...

  6. 第10章 接口、继承与多态----抽象类和接口

    一.抽象类 在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理.回想继承和多态原理,继承树中越是在上方的类越抽象,如:鸽子类继承鸟类.鸟类继承动物类等.在多态机制中,并不需要 ...

  7. 类之间的关系(关联、继承、聚合、组合、依赖、实现)

    类间关系 前言 继承(Generalization) 实现(Realization) 组合(Composition) 聚合(Aggregation) 关联(Association) 依赖(Depend ...

  8. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)

    接着上一篇的基础知识,今天俺们来学习一下: 面向对象 (万物皆对象) 三大特征(封装.继承.多态) 接口 接口 概述:接口是一种引用数据类型,是方法的'集合',接口的内部主要是定义方法,包含常量.抽象 ...

  9. 实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定

    简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. ...

最新文章

  1. eclipse下运行自定义maven命令
  2. Android UI学习 - Linear Layout, RelativeLayout
  3. python获取系统时间函数_python3中datetime库,time库以及pandas中的时间函数区别与详解...
  4. 让代码看起来更舒服, 修改VS颜色样式
  5. ubuntu系统和ROS系统的版本对应关系
  6. Myeclipse中weblogic配置
  7. SSH框架整合遇到的错误——org.springframework.beans.NotWritablePropertyException:
  8. 弹性式分布数据集RDD——Pyspark基础 (二)
  9. 日期范围 java_JavaJoDA时间-实现日期范围迭代器
  10. Java多线程系列(十一):ReentrantReadWriteLock的实现原理与锁获取详解
  11. ubuntu 下操作目录,出现Permission denied的解决办法
  12. msvcr80.dll 问题
  13. 在用JAVA写一个简易CAD程序时的笔记
  14. VMware虚拟机如何全屏显示
  15. php查询后台地址,dedecms 织梦后台查找方法【整理】
  16. 语句摘抄——第21周
  17. 微信小程序点击图片预览真机无法显示的问题
  18. 聪哥哥有话说之说说《短歌行》
  19. AI杠杆炒股机器人全自动平台
  20. java唯一id_生成唯一ID的四种办法 程序员必备

热门文章

  1. 01-CoreData 概述
  2. nginx rewrite 指令last break区别最详细的解释
  3. 从原则、方案、策略及难点阐述分库分表
  4. redis 数据结构 内存管理 持久化
  5. jstl c:choose、c:when和c:otherwise标签
  6. android安卓动态设置控件宽高
  7. Ubuntu下ssh免password登录安装
  8. 批量实现面向对象的实例
  9. [转载] 信息系统项目管理师考试论文写作要点
  10. C#中使用Monitor类、Lock和Mutex类来同步多线程的执行(转)