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 ...
随机推荐
- C#中回调函数的使用方法和区别
归纳来说有两种方式,一种是委托型回调,另一种是接口型回调 委托型回调 委托型回调包括纯委托型和事件型,他们的实现方式是通过公开成员注入的方式,其中纯委托型还可以用构造函数注入.方法注入的方式 接口型回 ...
- nodejs 简单的备份github代码初版
传送门:http://www.jianshu.com/p/002efed0d3af 我的代码: const https = require('https'); const fs = require(& ...
- mac环境下清理系统垃圾clearMyMac 3.9 破解版
mac环境下清理系统垃圾clearMyMac 3 轻轻松松清理好几十G的垃圾文件 下载地址 链接: https://pan.baidu.com/s/1XZbZwzhgQCnzpvQDvyQrRA 密码 ...
- jdbcTemplaate queryForObject的两个易混淆的方法
JdbcTemplate中有两个可能会混淆的queryForObject方法: 1. Object queryForObject(String sql, Object[] args, Class ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- nginx - KeepAlive详细解释
最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通过Client访问的是LVS的VIP, VIP后端挂载的RealServer是Nginx服务器. Client可以是浏览器 ...
- 进程间的八种通信方式----共享内存是最快的 IPC 方式
1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 2.高级管道(popen):将另一个程序当做一个新 ...
- SERVICE_STATUS结构各成员解析
在编写Windows服务的时候,需要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息,其第2个参数为指向SERVICE_STATUS结构的指针 ...
- jquery 滚动效果插件
1.css <style> .fl { float: left; } .slider0 img { display: block; width:100px; padding: 2px; } ...
- MySQL中使用INNER JOIN来实现Intersect并集操作
MySQL中使用INNER JOIN来实现Intersect并集操作 一.业务背景 我们有张表设计例如以下: CREATE TABLE `user_defined_value` ( `RESOURCE ...