JAVA类(下)
我看完了Java类,与C++相比,复杂了一点。其中有类的嵌套定义即内部类,枚举类等。
我看这两节花了我很多时间。其中有一些概念还是有点难懂。
下面,我详细总结内部类与枚举类。
内部类
内部类的主要作用:
- 提供更好的封装。
- 内部类成员可以直接访问外部类的私有数据。进而可以实现回调
- 匿名内部类适合用于创建那些仅需要一次使用的类。
注意,匿名内部类,在枚举中使用十分适合,应用广泛。
1.1非静态内部类
1.2静态内部类
1.3使用内部类
1.4匿名内部类
1.5闭包与回调
定义方式:方法中定义,称为局部内部类。
方法外定义,称为成员内部类。
因为内部类作为其外部类的成员,所以可以使用public private protected default
|
public private public Cow(){} public Cow(double weight) { this.weight=weight; } private { private private String color; public public CowLeg(double length,String color) { this.length=length; this.color=color; }
public { this.length=length; } public { this.color=color; } public { return } public String getColor() { return }
public { System.out.println("当前的长方形颜色是:" +color+",高:"+length); System.out.println("长方形的重量是:"+ weight); } } public { CowLeg c1=new CowLeg(1.12,"黑白相间"); c1.info(); } public // TODO Auto-generated method stub Cow cow =new Cow(378.9); cow.test(); } } |
产生了两个class字节文件
可以看到内部类与外部类的区别了吧!!
执行结果:

关键的知识点:
在非静态内部类里可以直接访问外部类的private成员,这是因为在非静态内部类对象里,保存了一个它寄存的外部类的对象的引用。
简单点説:必须有一个非静态内部类实例必须寄存在外部类实例里,因此,在外部类中不能使用内部类中的成员变量
System.out.println(new Cow().weight);
如上句话,就可以访问内部类的私有变量了。
如果外部类成员变量、内部类成员变量与内部类里方法的局部变量同名,则可以通过:
this
外部类名.this.局部变量名
来调用内部、外部。
非静态内部类不能有静态方法、静态成员变量、静态初始化块
定义方式:与1.1中定义相同,但是修饰符为static
|
public
private private Object StaticInnerClass; private public { System.out.println("我是静态变量"); } static { private public { System.out.println(prop2); info(); } } public // TODO Auto-generated method stub StaticInnerClassTest test=new StaticInnerClassTest(); StaticInnerClassTest.StaticInnerClass demo=new StaticInnerClassTest.StaticInnerClass(); demo.accessOuterPro(); }
} |
这个类属于外部类的本身,称类内部类,并且 static不可以修饰外部类,但可以修饰内部类.
静态内部类能有静态方法、静态成员变量、静态初始化块
以及非静态的。
静态内部类只能访问外部类的类成员
接口中允许使用:内部类 修饰符,一般为public
|
public
class In { public In(String msg) { System.out.println(msg); } } public { public {@SuppressWarnings("unused") CreateInnerLnstance.In in = new CreateInnerLnstance().new In("信息测试");}
} @SuppressWarnings("static-access") public // TODO Auto-generated method stub CreateInnerLnstance.CreateInnerInstance in = new CreateInnerLnstance.CreateInnerInstance(); in.testt(); }
} |
执行结果:

内部类的深层次嵌套:
|
package test;
public
public { public t() { System.out.println("I am outclass"); } public { public t1() { System.out.println("I am inner1"); } public { public t2() { System.out.println("I am inner2"); } } } } public // TODO Auto-generated method stub tes.t.t1.t2 testt2=new tes.t.t1.t2(); } } |
执行结果

在外部类以外使用非静态内部类
在外部类以外的地方定义内部类
OuterClass.new InnerConstructor ()
非静态内部类的构造器必须使用外部类对象来调用。因此在使用上一句时,必须已经创建了外部类了。
继承内部类
|
class Out { class In { public In(String msg) { System.out.println(msg); } } } class SubClass extends Out.In { public SubClass(Out out)//此参数不可少!!!! { out.super("hello");//此句话不可少!!!! /*** 函意是:调用out的内部类的构造函数 ***/
} } |
在外部类以外使用静态内部类
定义格式
new OuterClass.InnerConstructor ()
New 父类构造器(实参列表) | 实现接口( )
{
//实现接口、或抽象类
}
|
package Anonymous; interface Product { public public String getName(); } public
public { System.out.println("购买了一个"+p.getName()+"\n价格是 "+p.getPrice()); } public // TODO Auto-generated method stub AnonyMousTest ta = new AnonyMousTest(); ta.test( new Product() { public { return 1; } public String getName() { return } } ); }
} |
|
package AnonymousInner; abstract { private String name; public public Device(){} public Device(String name) { this.name = name; } public String getName() { return } } public public { System.out.println("购买了一个"+d.getName()+",花掉了"+d.getPrice()); } public // TODO Auto-generated method stub AnonymousInner ai = new AnonymousInner(); ai.test(new Device("电子示波器") { public { return 67.8; } }); Device d = new Device() { { System.out.println("匿名内部类的初始化块..."); } public { return 56.2; } public String getName() { return } }; ai.test(d); }
} |
|
interface A { void test(); } public
public // TODO Auto-generated method stub final A a =new A() { public { System.out.println(age); } }; a.test(); }
}
|
1.5
闭包:一种被调用的对象,它保存了创建它的作用域信息。
可以把非静态内部类当成面向对象领域的闭包。
回调:某个方法一旦获得了内部类对象的引用后,就可以在适合的时候反过来云调用外部类实例的方法。
|
interface Teachable { void work(); } class Programmer {
private String name; public Programmer(){} public Programmer(String name) { this.name=name; } public String getName() { return } public { System.out.println(name+"在灯下认真敲键盘。。。"); } } class TeachableProgrammer extends Programmer { public TeachableProgrammer(){} public TeachableProgrammer(String name) { super(name); } private { System.out.println(getName()+"老师在讲台上讲解。。。"); } private { public { teach(); } } public Teachable getCallbackReference() { return } } public public TeachableProgrammer tp = new TeachableProgrammer("李刚"); tp.work(); tp.getCallbackReference().work();
}
} |
枚举类
例一
|
public
public { switch(s) { case System.out.println("春暖花开,正好踏青"); break; case System.out.println("夏日炎炎,适合游泳"); break; case System.out.println("秋高气爽,进补及时"); break; case System.out.println("冬日雪飘,围炉赏雪"); break; } } public // TODO Auto-generated method stub for(SeasonEnum s:SeasonEnum.values()) { System.out.println(s); } new EnumTest().judge(SeasonEnum.SPRING); }
} |
|
public SPRING,SUMMER,FALL,WINTER; } |
例二
|
public MALE("man"),FEMALE("woman"); private private Gender(String name) { this.name=name; } public String getName() { return } } |
|
public
/** * @param args */ public // TODO Auto-generated method stub Gender g= Enum.valueOf(Gender.class, "FEMALE"); System.out.println(g+" stand for "+g.getName()); }
} |
例三
例四
JAVA类(下)的更多相关文章
- DOC下编译和运行带有包的java类文件
前言: 带有包名的java类在DOC下编译可以成功,但是运行出错 错误: 找不到或无法加载主类 com.soanl.socket.MyServer D盘temp文件下有个Hello.java文件,包 ...
- Eclipse下生成/编辑Java类图或时序图(UML)[转载]
一 引用文章 1.[eclipse下生成Java类图和时序图,生成UML图(更完整版)](https://blog.csdn.net/guomainet309/article/details/5302 ...
- [Java]类的生命周期(下)类的初始化[转]
上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...
- [ 转载 ] Java基础10--关于Object类下所有方法的简单解析
关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...
- 带包的java类在cmd环境下的执行办法
带包的java类在cmd环境下的执行办法:工程目录为D:\Program Files\eclipse\workspace\ReadFileByLinesUniq上面目录下有两个文件夹bin和src源文 ...
- java扫描某个包下的所有java类并加载
最近在学习java的反射和注解,实际情景中需要扫描某个包下的所有java类,然后使用类加载器加载类. 基本思路,获得程序的路径扫描src下某个包内的子包和java类,实现也比较简单. 运行环境:win ...
- Java中的静态方法和实例方法的调用的理解(不同的类下的方法调用)
public class MethodCall { public static void main(String[] args) { Test.sayStatic(); Test test = new ...
- eclipse debug模式下总是自动跳到ThreadPoolExecutor.java类
1.情景展示 使用eclipse,debug模式运行项目时,总是会调用这个ThreadPoolExecutor.java类,明明没有打断点却自动停止运行. 2.原因分析 在eclipse中,默认是 ...
- Java取得一个对象里所有get方法和set方法, 读取某个类下所有变量的名称
所有get方法和set方法public void getMethod(Object obj){ Class clazz=obj.getClass();//获得实体类名 Field[] fields = ...
随机推荐
- 洛谷 P2374 搬运工
P2374 搬运工 题目背景 陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖牟取暴利.(ps:描述要看懂) 题目描述 前些天,高一的新同学来了,他便像往常一样兜售他的书,经过一番口舌,同学们 ...
- CentOS6.X安装10G需要额外安装的软件包
yum -y install libXp yum -y install libXp.i686 yum -y install libXtst.i686
- 洛谷—— P1967 货车运输 || COGS——C 1439. [NOIP2013]货车运输
https://www.luogu.org/problem/show?pid=1967#sub || http://www.cogs.pro/cogs/problem/problem.php?pi ...
- NYOJ 552 小数阶乘
小数阶乘 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描写叙述 编写一个程序,求一个数m的阶乘. 输入 有多组測试数据,以EOF结束. 每组測试数据有1个整数m. 输出 每 ...
- WebService--CXF以及CXF与Spring的整合(jaxws:server形式配置)
前言:好记性不如烂笔头,写博客的好处是,以前接触的东西即便忘记了,也可以从这里查找. Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来 ...
- <一> 爬虫的原理
一.爬虫是什么? #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数 ...
- 写PPT的先扬后抑的思路
近期给一个客户做IT战略规划. 基本结束了,客户要求写点有高度的东西.我想也是,尽管眼下的PPT也触及到战略和行业的问题,可是没有总结出来.于是就挖空心思,琢磨了三天.写了4页PPT.改动了几遍.还算 ...
- Oracle批量插入在C#中的应用
public void SetUserReportResult(int[] reportId, bool isReceive, string result) { if (reportId == nul ...
- Android javaMail使用imap协议接收邮件
在这里说明一下,pop3和imap协议都是接收邮件的,但是他们还是有很多不同的. IMAP和POP有什么区别? POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件. ...
- mybatis+springmvc缓存设置
开始接触mybatis,本以为缓存设置好麻烦,在网上找了好多相关的资料,说得也都好复杂,经过自己亲自实践,其实很简单的. 首先引入需要的jar包,参照pom.xml配置: <!-- 缓存设置 s ...