Java内部类复习
package com.t_06; import org.junit.Test; import com.t_06.StaticClass.StaticInnerClass; /**
* 一个类的定义放在另一个类的内部,这个类就叫内部类
* @author Administrator
*
*/
public class First { public class Contents{//像这样的,Contents就叫做内部类,内部类了解外部类,并能与之通信
public void f(){
System.out.println("In Class First's inner Class Contents method f()");
}
}
@Test
public void fun(){
Second second=new Second();
second.setStr("鸟");
Second.Contents contents=second.new Contents();//创建内部类对象使用的是外围类对象.new内部类对象的方式
contents.f();
}
/**
* 此时,内部类是private的,可以它的外围类Painter以外,没人能访问
* 这样private内部类给类的设计者提供了一种途径,通过这种途径可以完全阻止任何依赖类型的编码,并完全隐藏实现的细节
*/
@Test
public void fun2(){
Painter painter=new Painter();
Shape shape=painter.getShape();
shape.paint();
} /**
* 方法内部的类
* 可以在方法内创建一个类
* 值得注意的是:方法内部创建的类,不能加访问修饰符
* 另外方法内部的类也不是在调用方法时才创建的,它们一样被编译了
*/
public void test1(){
class Inner{
public void method(){
System.out.println("在方法内部创建的类");
}
}
} @Test
public void fun3(){
Painter painter=new Painter();
Shape shape=painter.getShape1();
shape.paint();
} /**
* 在implemention1和2中匿名内部类用在字段初始化的地方,这样定义的工厂方法是不是看起来更舒适些?
* 没感觉!
*/
@Test
public void fun4(){
service(implemention1.factory);
service(implemention2.factory); ServiceFactory factory1=implemention1.factory;
Service service1=factory1.getService();
service1.method1(); ServiceFactory factory2=implemention2.factory;
Service service2=factory2.getService();
service2.method1();
} public void service(ServiceFactory factory){
Service service = factory.getService();
service.method1();
}
@Test
public void fun5(){
StaticClass.StaticInnerClass inner=new StaticClass.StaticInnerClass();
System.out.println(inner.getNum());
} } class Second{
/**
* 创建了内部类对象时,他会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需要任何特殊条件。
*/
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public class Contents{
public void f(){
System.out.println("First.str="+str);
}
}
} /**
* 内部类与向上转型
* @author Administrator
*
*/
interface Shape{
public void paint();
}
class Painter{
private class InnerShape implements Shape{ public void paint() {
System.out.println("painter paint() method");
} }
public Shape getShape(){
return new InnerShape();
} /**
* 匿名内部类,注意后面要有一个分号,如果匿名内部类中需要使用一个参数,那么该参数一定是final类型的
* 匿名内部类里面没有构造器,如果想要模仿构造器效果,可以采用代码块{}
*
*/
public Shape getShape1(){
return new Shape(){ public void paint() {
System.out.println("painter paint() method");
}
{
System.out.println("init method!");
} };
}
}
/**
* 通过匿名内部类改造工厂方法
*
*/
interface Service{
public void method1();
}
interface ServiceFactory{
Service getService();
}
class implemention1 implements Service{ public void method1() {
System.out.println("In Implemention1 method method1()");
} public static ServiceFactory factory=new ServiceFactory(){ public Service getService() {
return new implemention1();
} }; }
class implemention2 implements Service{ public void method1() {
System.out.println("In Implemention2 method method1()");
} public static ServiceFactory factory=new ServiceFactory(){ public Service getService() {
return new implemention2();
} }; } /**
* 嵌套类
* static的内部类就叫嵌套类
* 嵌套类是一个例外,使用嵌套类的时候注意:
* 嵌套类直接通过new来创建
* 在嵌套类中,不能像普通内部类一样访问外部类的非static成员
* 嵌套类中可以有static方法,不同内部类中不允许有这个。
*/ class StaticClass{
private int num;
private static int sum=;
public static class StaticInnerClass{
public int getNum(){
return sum;
}
}
} /**
* 为什么要内部类
* a、内部类提供了某种进入外围类的窗户。
* b、每个内部类都能独立继承一个类,无论父类是否已经继承了某个类
*/
Java内部类复习的更多相关文章
- java 内部类复习
/** * 内部类详解 * * @author shao * */ public class InnerClass { public static void main(String[] args) { ...
- java基础复习记录
java基础复习记录(数组.对象.异常) 数组 数组的定义 数组是相同类型数据的有序集合.如:篮球队就是一个数组,队员球服上有号码,相当于索引.通过某一个的某一个号码来确认是某一个队员.数组中索引从0 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
随机推荐
- docker创建私有仓库及存储image
Docker官方的Docker hub尽管提供了有非常多image,也基本上包括了我们须要使用的,可是其訪问起来比較慢.假设自己要定制image.多台server之间的共享使用此image非常不方便. ...
- OpenReadWithHttps
///<summary>///采用https协议访问网络///</summary>///<param name="URL">url地址</ ...
- Codeforces Hello2015第一题Cursed Query
英文题面: De Prezer loves movies and series. He has watched the Troy for like 100 times and also he is a ...
- git stash 保存当前工作状态
1. git stash 暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...
- NativeBase准备工作
环境 node>= 4.0 npm>= 3.0 rnpm (only if React Native version < 0.29) ReactNativeCLI 安装及运行 ht ...
- oracle索引INdex
索引是与表相关的一种可选择数据库对象.索引是为提高数据检索的性能而建立,利用它可快速地确定指定的信息. 索引可建立在一表的一列或多列上,一旦建立,由ORACLE自动维护和使用,对用户是完全透明的.然而 ...
- java 面试总结
1.static变量与实体变量的差别? static是静态变量,static能够通过类名直接訪问 内存方面的不同:static在定义的时候jvm就会分配空间, 而实体变量仅仅有在创建对象的时候才会去分 ...
- 九度OJ 1163:素数 (素数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8496 解决:2887 题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数 ...
- 九度OJ 1034:寻找大富翁 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5925 解决:2375 题目描述: 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入: 输入包含多组测试用例. ...
- iOS 流布局 UICollectionView使用(UICollectionVIew的代理方法)
UICollectionViewDataSource协议 这个协议主要用于collectionView相关数据的处理,包含方法如下: 设置分区数(这个是可选实现的) - (NSInteger)numb ...