自学java 第十章内部类(二)

今天主要学习了匿名内部类。

匿名内部类是一种特殊的内部类,它没有类名,是通过继承一个类或实现一个接口来创建的,匿名内部类相当于基类的一个导出类,不过它只能通过向上转型为基类类型后才能被使用。

匿名内部类主要用于对继承方法进行实现或覆盖,它不需要添加其它的方法,即使添加也无法使用(因为它没有类名,只能通过向上转型使用,且无法向下转型,因此添加的其它方法也就无法访问)。

匿名内部类如果想使用外部定义的对象,则编译器要求参数引用必须是final类型,否则会报错。如:

public Destination destination(final String s){

    return new Destination(){

      private String item=s;

  }

};

匿名内部类可以通过实例初始化来达到为匿名内部类创建一个构造器的效果。如:

DangerousMonster getMonster(){
return new DangerousMonster(){
{System.out.println("this is Inside instance initializer");}
@Override
public void menace() {
System.out.println("this is DangerousMonster.menace()");
}
@Override
public void destroy() {
System.out.println("this is DangerousMonster.destroy()");
}
};

使用匿名内部类来设计工厂方法会达到更好的效果:

package chapter_ten;

import java.util.Random;

public class Demo_seventeen {
static void playGame(GameFactory f){
Game g=f.getGame();
g.play();
}
public static void main(String[] args) {
playGame(ThrowCoin.factory);
playGame(ThrowDice.factory);
}

}

interface Game{
void play();
}

interface GameFactory{
Game getGame();
}

class ThrowCoin implements Game{ //抛硬币

private Random rand=new Random();
public void play() {
if(rand.nextInt(2)==1)
System.out.println("您此次抛的是正面");
else
System.out.println("您此次抛的是反面");
}
public static GameFactory factory=new GameFactory(){

@Override
public Game getGame(){
return new ThrowCoin();
}
};
}

class ThrowDice implements Game{ //掷骰子
private Random rand=new Random();
public void play(){
switch(rand.nextInt(6)+1){
case 1:
System.out.println("您掷的是1");
break;
case 2:
System.out.println("您掷的是2");
break;
case 3:
System.out.println("您掷的是3");
break;
case 4:
System.out.println("您掷的是4");
break;
case 5:
System.out.println("您掷的是5");
break;
case 6:
System.out.println("您掷的是6");
break;
}
}
public static GameFactory factory=new GameFactory(){
@Override
public Game getGame(){
return new ThrowDice();
}
};
}

时间: 2024-10-08 10:07:14

自学java 第十章内部类(二)的相关文章

自学java 第十章内部类(一)

今天学习了一部分java中的内部类. 内部类指将一个类的定义放在另一个类的内部,那它就是一个内部类. 指明一个引用时内部类的类型可以通过"外部类名.内部类名"的写法声明,如果想返回一个内部类的对象可以通过在外部类中写一个返回该内部类的方法或者通过"外部类对象.new 内部类名()"的写法返回内部类对象. 内部类拥有对外部类所有元素的访问权,可以直接访问:而外部类则需要先创建一个内部类的对象,通过这个对象可以访问内部类中的任意成员. 内部类也可以继承类或实现接口,因此

自学java 第十章内部类(三)

前两天学校断网,没能及时写,今天总结一下所学的内部类的剩余部分. 1.声明为static的内部类一般称为嵌套类.普通的内部类对象隐式地保存了一个引用,指向一个创建它的外围对象,而内部类为static时则不是这样: (1).要创建static内部类的对象,并不需要其外围类对象: (2).不能用static内部类的对象访问非静态的外围类对象. 类可以在接口中创建,但都自动是public和static类型的,甚至可以在一个接口的内部类中实现该接口. 2.使用内部类的原因:(1).因为内部类允许继承多个

“全栈2019”Java第九十章:内部类可以向上或向下转型吗?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十章:内部类可以向上或向下转型吗? 下一章 "全栈2019"Java第九十一章:内部类具有多态特性吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

“全栈2019”Java第一百零二章:哪些作用域可以声明局部内部类?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百零二章:哪些作用域可以声明局部内部类? 下一章 "全栈2019"Java第一百零三章:匿名内部类详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

Java编程思想---第十章 内部类(下)

第十章 内部类(下) 10.9 内部类的继承 因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候事情会变得有些复杂,问题在于那个指向外围类对象的引用必须被初始化,而在导出类中不再存在可连接的默认对象,要解决这个问题,必须使用特殊的语法来明确说清他们之间的关联: class WithInner { class Inner {} } public class InheritInner extends WithInner.Inner { InheritInner(WithInn

Java编程思想---第十章 内部类(上)

第十章  内部类(上) 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一种非常有用的特性,它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性,但内部类与组合是完全不同的概念. 10.1 创建内部类 创建内部类的方法就是,把类的定义置于外围类的里面: public class Parcel1 { class Contents { private int i = 11; public int value() { return i; } } class Destina

自学java很难?其实学好java只用4个月

Java学习大概需要多久?这篇文章教你自学java的学习路线 一.首先便是学习基础知识 1.书籍方面 推荐两本<Java编程思想>和<Java核心技术>这两本书有点年头了,也重新发布了好几代,但是最主要的是体系完整,实例多,可操作性强.初学者可以先看<java核心技术>的前六章 Java程序设计概述 Java程序设计环境 Java的基础程序设计结构 对象与类 继承 接口与内部类 2.java视频推荐 网上的java基础视频是很多的,可以去b站,腾讯课堂上找视频和公开课看

自学java大概要多久?这篇文章给你答案,仅需4个月学会java

Java学习大概需要多久?这篇文章教你自学java的学习路线一.首先便是学习基础知识1.书籍方面推荐两本<Java编程思想>和<Java核心技术>这两本书有点年头了,也重新发布了好几代,但是最主要的是体系完整,实例多,可操作性强.初学者可以先看<java核心技术>的前六章1.Java程序设计概述2.Java程序设计环境3.Java的基础程序设计结构4.对象与类5.继承6.接口与内部类2.java视频推荐网上的java基础视频是很多的,可以去b站,腾讯课堂上找视频和公开课

Java提高篇(三六)-----java集合细节(二):asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷.先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:&