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内部类复习的更多相关文章

  1. java 内部类复习

    /** * 内部类详解 * * @author shao * */ public class InnerClass { public static void main(String[] args) { ...

  2. java基础复习记录

    java基础复习记录(数组.对象.异常) 数组 数组的定义 数组是相同类型数据的有序集合.如:篮球队就是一个数组,队员球服上有号码,相当于索引.通过某一个的某一个号码来确认是某一个队员.数组中索引从0 ...

  3. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  4. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  5. 黑马----JAVA内部类

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...

  6. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  7. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  8. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  9. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

随机推荐

  1. jquery 判断元素显示或隐藏

    $().is(":hidden"); $().is(":visible");

  2. asp.net模拟请求

    在asp.net模拟请求,微软在控件状态有安全性控制. __VIEWSTATE.__EVENTVALIDATION要与服务端页面(.aspx)中元素信息保存一致.

  3. HTTP基础(分析两个例子)

    两个例子(一个get,一个post)(一个是访问页面,一个是提交修改后的博文): preferences.aspx:(header)(文件) 1.     Remote Address:42.121. ...

  4. Android微信分享功能实例+demo

    Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...

  5. ORACLE schedule job设置

    --创建job begin DBMS_SCHEDULER.CREATE_JOB ( job_name => 'APICALL_LOG_INTERFACE_JOB', job_type => ...

  6. JavaScript实现对象数组按不同字段排序

    如果有一个对象数组,我们想要依据某个对象属性对数组进行排序.而传递给数组sort()方法的比較函数要接收两个參数,即要比較的值.但是.我们须要一种方式来指明依照哪个属性来排序.要解决问题,能够定义一个 ...

  7. 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

    include "stdafx.h" #include<iostream> #include<vector> #include<algorithm&g ...

  8. WPF实现带全选复选框的列表控件

    本文将说明如何创建一个带全选复选框的列表控件.其效果如下图: 这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成.它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中 ...

  9. convert from EST/EDT to GMT

    TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime ...

  10. Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现

    前面写过<墨迹天气3.0引导界面及动画实现>,里面完美实现了动画效果,那一篇文章使用的View Animation,这一篇文章使用的Property Animation实现.Propert ...