一,内部类

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

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

 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. 从svn迁移至Git并保留所有 commit 记录

    用户映射文件user.txt,等号左边为svn账号,右边为Git用户名和邮箱.注意:svn中有多少用户就要映射多少 test1=test1<147258369@qq.com>test2=t ...

  2. Flink RichSourceFunction应用,读关系型数据(mysql)数据写入关系型数据库(mysql)

    1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink的核心是转化为流进行计算.Flink三个核心:Source,Transforma ...

  3. Linux下system()函数的实现

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types. ...

  4. react-native项目中禁止截屏与录屏

    在android/app/src/main/java/com/projname/MainActivity.java文件中的onCreate方法添加一下代码即可 import android.view. ...

  5. Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)

    <题目链接> 题目大意:给定一个无向图,该无向图不含自环,且无重边.现在要你将这个无向图定向,使得不存在任何一条路径长度大于等于2.然后根输入边的顺序,输出构造的有向图.如果构造的边与输入 ...

  6. 研究比对搞定博客 canvas-nest.js

    经过比对网站源码,发现大的差异,复制代码添加成功. 参考:https://www.cnblogs.com/kexing/p/7264767.html 申请js权限 编辑   具体编辑请自行实验, 附上 ...

  7. JavaWeb从开发环境搭建,到第一个servlet程序(图文)

    ##  开学到今天,已经是第三周了~  然而这门课的教材还没发~   滋滋滋   表示很“蓝瘦”~~~ Java Web开发环境搭建 1. 下载安装Tomcat 官网地址:http://tomcat. ...

  8. PBRT笔记(10)——体积散射

    体散射处理过程 3个影响参与介质在环境中的辐射度分布的主要因素: 吸收:减少光能,并将其转化为别的能量,例如热量. 发光:由光子发射光能至环境中. 散射:由于粒子碰撞,使得一个方向的辐射度散射至其他方 ...

  9. Stream闪亮登场

    Stream闪亮登场 一. Stream(流)是什么,干什么 Stream是一类用于替代对集合操作的工具类+Lambda式编程,他可以替代现有的遍历.过滤.求和.求最值.排序.转换等 二. Strea ...

  10. Y1吐槽001 怎么做产品

    做一个产品,这个产品是做给用户用的还是做给领导看的完全是两个不同的出发点..做给领导看有好处,毕竟领导有知道进展的权利和指导方向的作用,还有一个好处就是表现得好. 忽略了使用者的感受是非常致命的,标模 ...