一,内部类

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

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

 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. LeetCode 9. Palindrome Number(c语言版)

    题目: Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same ...

  2. cadcam

    Email:kefu007@vip.qq.com 13D TIMON 2007 英語版2007 23DVIA Composer V6R2013 中文版2013 3ABQUS V6.11 6.11 4A ...

  3. 【java】Java组件概览(2)— 基本库

    1.Math Math相关的库包括包括浮点库(java.lang.Math和java.lang.StrictMath)和任意精度数学(java.math包). (1)java.lang.Math 该类 ...

  4. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  5. spring-cloud-zuul服务网关

    Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,类似于保安的职能,而过滤器功能则负责对请求的处理过程进行干预,是实 ...

  6. spring 报错

    一. java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 解决方案: 1. ...

  7. python numpy和pandas做数据分析时去掉科学记数法显示

    1.Numpy import numpy as np np.set_printoptions(suppress=True, threshold=np.nan) suppress=True 取消科学记数 ...

  8. java中文和unicode编码相互转换(转)

    工具类代码如下: package aa.com; import java.io.UnsupportedEncodingException; public class UnicodeUtil { pub ...

  9. .net基础学java系列(七)赶鸭子上架看项目代码

    项目用到的技术栈 序列化 com.alibaba.fastjson.JSON; https://github.com/alibaba/fastjson/wiki/Quick-Start-CN 日志 l ...

  10. golang 读书笔记

    介绍 Go语言是一种让代码分享更容易的编程语言.Go语言自带一些工具,让使用别人写的包更容易,并且分享自己写的包更容易. Go语言对并发的支持是这门语言最重要的特性之一.goroutine很像线程,但 ...