一,内部类

其实内部类是十分简单的,我们根据其字里行间的意义就可以知道内部类应该是一个类当中的一个类,相当于一个类进行了嵌套,就如同循环的嵌套一般。

内部类有一个特征:内部类当中可以调用外部类当中的属性和方法,而外部类却不能调用内部类当中的。除了这特征就没啥特征了,我们来看看代码了解一下(点击代码上方的文档小图标就可以复制代码,因为我加了代码的行号看起来整洁一些,但是复制可能不太方便):

 public class innerclass {
public static void main(String[] args) {
System.out.println("下面是是内部类的程序展示");
//创建外部类和内部类的方法有点不相同
A a=new A();
A.B b=new A().new B();//这里开始创建内部类的对象,这是创建内部类对象的专用格式,相当于在创建了一个外部类对象的基础上再创建一个内部类对象2
a.say2();
b.sayit();
}
}
class A
{
int waibu=12;
public void say2()
{
System.out.println("这是外部类当中的方法");
}
class B
{
int neibu=13;
public void sayit()
{
System.out.println("这是内部类里面的方法");
System.out.println("使用内部类和外部类当中的数值进行想加的结果是"+(neibu+waibu));
//之所以内部类可以使用外部类的属性是因为在创建对象的时候,已经给内部类的对象附加了一个外部类的对象,内部类的对象是建立在外部类对象的基础上的。
}
}
}

最终的sayit()方法输出结果是25=(13+12),从中可以证明内部类确实是可以调用外部类的属性的,但如果外部类调用内部类的属性则会发生报错。

二.匿名内部类

首先我们应该知道匿名内部类匿名是因为匿名内部类的具体名字不会被我们在程序当众编写出来,因为它已经在主方法当中被实例化了。

匿名内部类可以继承两类数据结构:一:抽象类

二:接口。

比如我们的代码有:

 public class innerclass {
public static void main(String[] args) { Chouxiang c=new Chouxiang() {
String name="Geek Song too";
public void say3()
{
System.out.println("这是匿名内部类当中的方法,重写了抽象类的方法");
System.out.println(name);
} }}
abstract class Chouxiang
{
String name="Geek Song";//抽象类的属性是不会被调用的,除了方法
public void say3()
{
System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");
} }

这显然继承了一个抽象类,并且在主方法当中创建了抽象类的对象,本来我们是应该先继承这个抽象类再开始创建对象的,否则对象是无法创建的,但是为了简便,人们创建了了匿名内部类,允许我们在主方法当中进行抽象类的实例化,同时也可以进行对象的创建。这个程序就等同于如下的程序:

 public class innerclass {
public static void main(String[] args) {
System.out.println("下面是是内部类的程序展示");
//创建外部类和内部类的方法有点不相同
A a=new A();
A.B b=new A().new B();
a.say2();
b.sayit();
System.out.println("现在开始匿名内部类程序的编写\n");
Chouxiang2 c=new Chouxiang2();
c.say5(); }} abstract class Chouxiang
{
String name="Geek Song";//抽象类的属性是不会被调用的,除了方法
public void say3()
{
System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");
} }
class Chouxiang2 extends Chouxiang
{
public void say3()
{
System.out.println("这是继承的方法");
}
}

因此这里就会涉及到多态和向上转型了,我们输出的子类的方法,父类的属性,匿名内部类也是相同的。输出的匿名内部类的方法,以及父类的属性。

完整的程序如下,方便大家进行知识点的理解:

 public class innerclass {
public static void main(String[] args) {
System.out.println("下面是是内部类的程序展示");
//创建外部类和内部类的方法有点不相同
A a=new A();
A.B b=new A().new B();
a.say2();
b.sayit();
System.out.println("现在开始匿名内部类程序的编写\n");
Chouxiang c=new Chouxiang() {
String name="Geek Song too";
public void say3()
{
System.out.println("这是匿名内部类当中的方法,重写了抽象类的方法");
System.out.println(name);
}
};//在使用匿名内部类的时候,当这个类在陈述完之后,是需要打分号的。
c.say3();
System.out.println("我们来看看这个name到底是抽象类当中的name还是匿名内部类当中的"+c.name);//结果果然是父类当中的属性,和我们多态的性质相重合了
//这就是所谓的向上转型。现在我们再来试试接口的匿名内部类实现
Jiekou yui=new Jiekou() {
@Override//由于必须实现接口当中的方法,因此计算机就自动为我们写上了override的标识符了
public void say5() {
System.out.println("这是继承的接口当中的方法");
}
};
yui.say5();
}
}
class A
{
int waibu=12;
public void say2()
{
System.out.println("这是外部类当中的方法");
}
class B
{
int neibu=13;
public void sayit()
{
System.out.println("这是内部类里面的方法");
System.out.println("使用内部类和外部类当中的数值进行想加的结果是"+(neibu+waibu));
//之所以内部类可以使用外部类的属性是因为在创建对象的时候,已经给内部类的对象附加了一个外部类的对象,内部类的对象是建立在外部类对象的基础上的。
}
}
}
//虽然内部类的程序已经成功了,但是匿名内部类的程序还没有成功,现在我们来创建一个匿名内部类(在主方法当中,首先应该创建一个抽象类或者接口)
abstract class Chouxiang
{
String name="Geek Song";//抽象类的属性是不会被调用的,除了方法
public void say3()
{
System.out.println("这是抽象类当中的方法,抽象类当中是允许有具体方法来进行实现的,接口不行");
} }
interface Jiekou
{
public void say5(); }

Java提高篇(三):内部类和匿名内部类的更多相关文章

  1. java提高篇(十)-----详解匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  2. 【转】java提高篇(十)-----详解匿名内部类

    原文网址:http://www.cnblogs.com/chenssy/p/3390871.html 在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节 ...

  3. java提高篇(十)-----详解匿名内部类 ,形参为什么要用final

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  4. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  5. java提高篇(三)-----java的四舍五入

    Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...

  6. java提高篇(八)----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  7. java提高篇(九)-----详解匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  8. java提高篇(七)-----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  9. java提高篇之详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  10. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

随机推荐

  1. java基础知识三 流

    Java 流(Stream).文件(File)和IOJava.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型 ...

  2. wtforms组件使用实例及源码解析

    WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. WTforms作用:当网站中需要用到表单时,WTForms变得很有效.应该把表单定义为类,作为单独的一个模块. ...

  3. K3 WISE 开发插件《K3 WISE常用数据表整理》

    在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单. ----------------系统设置------------------------ FStatu ...

  4. Java练习2

    1 编写一个应用程序,模拟机动车的加速和减速功能.机动车类Vehicle的UML图如下,其中speedUp()方法实现加速功能,速度上限为240 km/h:speedDown()实现降速功能,下限为0 ...

  5. Macro For Creating a dwStyle for a window without a menu bar and title bar

    Introduce For CreateWindowEx Creates an overlapped, pop-up, or child window with an extended window ...

  6. Kubernetes 1.10.0离线安装

    讲述如何通过离线的方式安装Kubernetes,主要用于对Kubernetes的研究学习,不建议在生产环境使用,安装包获取地址: 链接:https://pan.baidu.com/s/1nX5_mem ...

  7. python全栈开发day113-DBUtils(pymysql数据连接池)、Request管理上下文分析

    1.DBUtils(pymysql数据连接池) import pymysql from DBUtils.PooledDB import PooledDB POOL = PooledDB( creato ...

  8. 连接数据库出现java.sql.SQLException: Unknown system variable 'tx_isolation'

    问题分析 :mysql-connector-java的版本太低,数据库的版本太高 因此将mysql-connector-java升级到最新版本就解  .或者降低MySQL的版本.我之前用的是8.0版本 ...

  9. gulp 粗粗学习 记录下

    看视频学习 粗粗记录下 以便以后学习 1.初记录 gulp.task //定义一个任务 gulp.src //锁定到做task任务的文件路径 gulp.dest //锁定到任务做完后文件去向的路径 g ...

  10. SpringCloud入门

    一. 什么是 SpringCloud           什么是 SpringCloud:是一个服务治理平台,提供了一些服务框架.包含了:服务注册与发现.配置中心.消息中心 .负载均衡.数据监控等等. ...