从头认识java-8.11 为什么需要内部类?

这一章节我们来讨论一下为什么需要内部类?

答案:为实现多重继承提供便利。

在实现多重继承方面有两种方式:内部类以及接口。

1.接口

package com.ray.ch08;

public class Sequence implements A, B {

}

interface A {
}

interface B {
}

接口其实不用多说,你实现多少个都可以,然后只有根据接口就可以向上转型,调用相关的方法。

2.内部类

当我们需要继承实现的是类或者抽象类,根据语法规则,是不可以多重继承的,那么现在内部类就发挥作用了。

package com.ray.ch08;

public class Sequence implements A, B {
	class C implements A, B {
	}

}

interface A {
}

interface B {
}
package com.ray.ch08;

public class Sequence extends A {
	class C extends A {
	}

}

abstract class A {
}

从上面的代码看出,无论外部类实现什么接口或者继承什么类,对于内部类来说都是没有任何影响。

注意:只有在需要实现多重继承的时候才考虑内部类,不然一般不使用这种复杂的编程方式,因为影响代码的可读性。

当使用内部类之后,将获得以下特性:

(1)内部类可以有多个实例,而且实例跟外部类之间的通信是分开的。

package com.ray.ch08;

public class Sequence extends A {
	private int id = 0;

	class C extends A {
		public void setId(int id1) {
			System.out.println(id);
			id = id1;
		}
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public static void main(String[] args) {
		Sequence sequence1 = new Sequence();
		C c1 = sequence1.new C();
		c1.setId(2);
		System.out.println(sequence1.getId());
		Sequence sequence2 = new Sequence();
		C c2 = sequence2.new C();
		c2.setId(3);
		System.out.println(sequence2.getId());
	}

}

abstract class A {
}

输出:

0
2
0
3

从输出可以看见,虽然我们在第一次new C的时候改变了id,但是在第二此new C的时候是不受改变,因为它们分属不同实例,各自具有独立的状态。

(2)在单个外部类,里面的内部类可以使用不同的方式来实现同一个接口或者继承同一个类。

package com.ray.ch08;

public class Sequence {

	class B implements A {
		@Override
		public void run() {
			System.out.println("run1");
		}
	}

	class C implements A {
		@Override
		public void run() {
			System.out.println("run2");
		}
	}

	public static void main(String[] args) {
	}

}

interface A {
	void run();
}

总结:这一章节主要说明了为什么需要内部类,就是多重继承,当然一般我们是用不上的。

这一章节就到这里,谢谢。

-----------------------------------

目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-27 17:54:35

从头认识java-8.11 为什么需要内部类?的相关文章

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

Java面向对象程序设计--接口和内部类

1.接口的定义: In the Java programming language, an interface is not a class but a set of requirements for classes that want to conform the interface. 说明: 1) Interface 不是class,虽然interface具有class的一些特点,例如能够继承,能够定义相同类型的变量,而且和C++的abstract class非常像,但Java 的inter

Java语法糖4:内部类

内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.class.所以内部类的名字完全可以和它的外部类名字相同. 内部类分为四种:成员内部类.局部内部类.匿名内部类.静态内部类.先逐一了解下,再看下使用内部类有什么好处. 成员内部类 成员内部类是最常见的内

【Java编程思想】10.内部类

将一个类的定义放在另一个类的定义内部,这就是内部类. 10.1 创建内部类 内部类的名字是嵌套在外部类里面的 外部类可以有方法,返回一个指向内部类的调用.(外部类中可以调用内部类) 如果在外部类中,希望能在除了静态方法之外的任意位置创建某个内部类对象,那么可以向下面这样指明对象类型. OuterClassName.InnerClassName x = new InnerClassName(); 10.2 链接到外部类 在创建了一个内部类的对象后,内部类与制造它的外围对象(enclosing ob

java进阶11 static final关键字

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块. 被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说. 它不依赖类的特定的实例,被类的所有实例共享. package Static; public class Static { /* * 使用的情况 * 1:在对象之间共享值时 * 2:方便访问变量 * */ public static void main(String[] args){ Sta

Java基础11 对象引用(转载)

对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test{    public static void main(String[] args){        Human aPerson = new Human(160);    }  class Human{    public Human(int h){        this.height = h;    }    public int getHeight(){        return this

Java基础11 对象引用

Java基础11 对象引用 我们之前一直在使用"对象"这个概念,但没有探讨对象在内存中的具体存储方式.这方面的讨论将引出"对象引用"(object reference)这一重要概念. 对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test { public static void main(String[] args) { Human aPerson = new Human(160); } } class Human {

Java中为什么要使用内部类

一.前言 关于Java的内部类,要说的东西实在太多,这篇博文中也无法一一具体说到,所以就挑些重点的讲.关于内部类的使用,你可能会疑问,为什么我们要使用内部类?为了回答这个问题,你需要知道一些关于内部类的重点.所以本篇文章首先介绍了一些关于内部类的一些与众不同的地方,后面再解答为什么我们要使用内部类这个问题.各位看官,文章稍微有点长,深吸一口气.来,我们开始吧! 二.内部类定义 内部类定义非常简单,就是把一个类的定义放在另外一个外围类定义的里面.如下面代码所示: class OutterClass

“全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十三章:内部类应用场景(迭代器设计模式) 下一章 "全栈2019"Java第九十四章:局部内部类详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习

Java基础11:Java泛型详解

Java基础11:Java泛型详解 泛型概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参). 泛型的本质是为了参数化类型(在不创建新的类型的