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=2;
    public static class StaticInnerClass{
        public int getNum(){
            return sum;
        }
    }
}

/**
 * 为什么要内部类
 *     a、内部类提供了某种进入外围类的窗户。
 *     b、每个内部类都能独立继承一个类,无论父类是否已经继承了某个类
 */
时间: 2024-11-05 15:54:22

Java内部类复习的相关文章

java 内部类复习

1 /** 2 * 内部类详解 3 * 4 * @author shao 5 * 6 */ 7 public class InnerClass { 8 9 public static void main(String[] args) { 10 Man p = new Man("丽丽"); 11 Man.Son son = p.new Son("小丽丽"); 12 son.play(); 13 Man.Girl girl = new Man.Girl(); 14 gi

java面向对象复习

Java面向对象复习 1.类是抽象的,对象是具体的 2.方法的重载: 条件: (1):在同一个类中 (2):方法名称相同 (3):方法参数不同 3.构造方法: 语法: (1)必须和类名相同 (2)必须没有返回类型,可以重载 (3)如果没有自定义一个构造方法,系统会为自动创建一个无参构造方法 (4)如果已经自定义了一个构造方法,系统就不会创建这个无参的构造方法 作用: (1)初始化类中的成员变量 (2)完成一些必须的初始化工作 4.this相当于当前对象,一般情况下可以省略 5.作用域: 类的作用

Java内部类

本文是<Java核心技术 卷1>中第六章接口与内部类中关于内部类的阅读总结. Java中的内部类(inner class)是定义在另一个类内部的类.那么内部类有什么用呢?这里主要由三个内部类存在的原因: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.即,如果类A中定义了类B,那么类B可以访问类A中的数据,甚至是私有数据,但类A不能访问类B中的私有数据: 内部类可以对同一个包中的其他类隐藏起来.在一个包中,定义一个类时,即使不加上访问权限关键词,这个类也是包内其他类可访问的,不

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

Java内部类:匿名内部类(四)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部类的应用场景. 1.匿名内部类的概念 没有类名的类就称作为匿名内部类 2.匿名内部类的好处 简化书写 3.匿名内部类的使用前提 必须存在继承或者实现关系才能使用 4.匿名内部类的应用场景 匿名内部类一般是用于实参 示例代码: package com.rk.innerclass; public cla

Java内部类小程序(成员内部类,静态内部类,匿名内部类)

1 /** 2 * 测试java内部类(成员内部类,静态内部类,匿名内部类) 3 * 局部内部类不常用,就不写了. 4 * @package :java05 5 * @author shaobn 6 * @Describe : 7 * @Time: 2015-9-6 下午8:32:38 8 */ 9 public class TestInner { 10 11 /** 12 * @author shaobn 13 * @Describe : 14 * @param args 15 * @Time

[Java基础] Java线程复习笔记

先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java是第一个在语言层面就支持线程操作的主流编程语言.和进程类似,线程也是各自独立的,有自 己的栈,自己的局部变量,自己的程序执行并行路径,但线程的独立性又没有进程那么强,它们共享内存,文件资源,以及其他进程层面的状态等.同一个进程内的 多个线程共享同样的内存空间,这也就意味着这些线程可以访问同样的变量和

Java内部类的使用小结

内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可

Java高级复习㈠ 多线程

1.线程 也称为轻量级进程,每个线程有自己的堆栈.程序计数器.局部变量.与进程相比,进程中的线程之间隔离程度要小 2.Java实现 ①implements Runnable ②extends Thread 一般推荐① 3.sleep().yield() sleep()方法对当前线程操作,指定以毫秒为单位的线程最小休眠时间,除非线程因中断提早恢复执行,否则不会在这段时间前恢复执行.线程可调用另一线程的interrupt()方法,向暂停的线程发出InterruptedException,变相唤醒暂停