Java编程思想读书笔记之内部类

现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读《Java编程思想》,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始说起。

一.为什么需要内部类

1.一个内部类的对象可以访问它的外围类的私有数据。

2.对于同一个包中的其他类来说,内部类能够隐藏起来。

3.使用内部类实现多重继承。

二.内部类重要提要

1.在方法内部或者方法内部的作用域的内部类

eg:方法内部的内部类

public interface InnerInterface {
    String getStr1(String xxx);
}
public class Outer {
    private InnerInterface getStr() {
        class Inner implements InnerInterface {
            String sss = "";

            @Override
            public String getStr1(String xxx) {
                sss = xxx;
                return sss;
            }
        }

        Inner inner = new Inner();
        return inner;
    }

    public static void main(String[] args) {
        InnerInterface innerInterface = new Outer().getStr();
        System.out.println(innerInterface.getStr1("1234"));
    }
}

eg方法作用域的内部类

public interface Inface {
    void sysout();
}
public class Outer {
    Inface getInface(boolean flag) {
        if (flag) {
            class Inner implements Inface{
                @Override
                public void sysout() {
                    System.out.println("876");
                }
            }
            Inner inner = new Inner();
            return inner;
        } else {
            class Inner implements Inface {
                @Override
                public void sysout() {
                    System.out.println("123");
                }
            }
            Inner inner = new Inner();
            return inner;
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Inface inface = outer.getInface(true);
        inface.sysout();

        inface = outer.getInface(false);
        inface.sysout();
    }
}

2.匿名内部类。

匿名内部类只能使用一次,主要用来简化代码

但使用匿名内部类还有个前提条件:内部类必须继承一个父类或实现一个接口

eg:实现接口的demo

public class Outer {
    private String str = "123";

    public interface InnerCalss{
        String value(String xxx);
    }

    public InnerCalss getInnerCalss() {
        return new InnerCalss() {
            private String i;
            public String value(String xxx){
                i = xxx;
                return i;
            }
        };
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        System.out.println(outer.getInnerCalss().value("12345"));
    }
}

eg:继承父类的的demo

public class Outer {
    public abstract class InnerInterface {
        abstract String getStr1(String xxx);
    }
    private InnerInterface getStr() {
        return new InnerInterface() {
          private String sss = "";
            @Override
            public String getStr1(String xxx) {
                sss = xxx;
                return sss;
            }
        };
    }

    public static void main(String[] args) {
        InnerInterface innerInterface = new Outer().getStr();
        System.out.println(innerInterface.getStr1("1234"));
    }
}

看着这个实现匿名内部类是不是觉得不是很常用下面的代码或许就知道原来自己一直在写匿名内部类,只是未察觉而已

public class ThreadInnerClass {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                System.out.println("1234567");
            }
        };
        t.start();
    }
}
public class RunnableInnerClass {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                    System.out.print("1234567");
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}
另外匿名内部类参数必须为final类型,这里借用书里的demo
public class Parcel10 {
  public Destination
  destination(final String dest, final float price) {
    return new Destination() {
      private int cost;
      // Instance initialization for each object:
      {
        cost = Math.round(price);
        if(cost > 100)
          System.out.println("Over budget!");
      }
      private String label = dest;
      public String readLabel() { return label; }
    };
  }
  public static void main(String[] args) {
    Parcel10 p = new Parcel10();
    Destination d = p.destination("Tasmania", 101.395F);
  }
} /* Output:
Over budget!
*///:~

3.嵌套类

嵌套类主要是两种

(1)嵌套类将内部类用static修饰或者是接口内部类

eg:这里引用书中的demo

public class Parcel11 {
  private static class ParcelContents implements Contents {
    private int i = 11;
    public int value() { return i; }
  }
  protected static class ParcelDestination
  implements Destination {
    private String label;
    private ParcelDestination(String whereTo) {
      label = whereTo;
    }
    public String readLabel() { return label; }
    // Nested classes can contain other static elements:
    public static void f() {}
    static int x = 10;
    static class AnotherLevel {
      public static void f() {}
      static int x = 10;
    }
  }
  public static Destination destination(String s) {
    return new ParcelDestination(s);
  }
  public static Contents contents() {
    return new ParcelContents();
  }
  public static void main(String[] args) {
    Contents c = contents();
    Destination d = destination("Tasmania");
  }
}
public interface ClassInInterface {
  void howdy();
  class Test implements ClassInInterface {
    public void howdy() {
      System.out.println("Howdy!");
    }
    public static void main(String[] args) {
      new Test().howdy();
    }
  }
}

关于内部类就总结这些,因为这些平时很少用到,做下笔记,当做个备忘录吧

参考文档:《Java编程思想》第四版

时间: 2025-01-12 08:45:48

Java编程思想读书笔记之内部类的相关文章

JAVA编程思想读书笔记(五)--多线程

接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/details/42441895 daemon是相于user线程而言的,可以理解为一种运行在后台的服务线程,比如时钟处理线程.idle线程.垃圾回收线程等都是daemon线程. daemon线程有个特点就是"比较次要",程序中如果所有的user线程都结束了,那这个程序本身就结束了,不管daemon是否

Java编程思想读书笔记

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4290955.html 第一章对象导论... 1 第二章一切都是对象... 4 第三章操作符... 10 第四章流程控制... 12 第五章初始化与清理... 14 第六章访问权限控制... 15 第七章复用... 23 第八章多态... 2

Java编程思想读书笔记--第14章类型信息

7.动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. 什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 代理模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口,这样一来在任何可以使用目标对象

Java编程思想读书笔记_第三章

本章提到的关于==的部分,一个完整的实验如下: 1 class Test { 2 public static void main(String[] args) { 3 Integer i = new Integer(47); 4 Integer j = new Integer(47); 5 Integer i1 = 47; 6 Integer j1 = 47; 7 int i2 = new Integer(47); 8 int j2 = new Integer(47); 9 int i3 = 4

java编程思想读书笔记 第十二章 通过异常处理错误(下)

1.异常的限制 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常.这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工资,异常也不例外. 下面的例子是在编译时施加在异常上面的限制: public class BaseBallException extends Exception {} public class Foul extends BaseBallException{} public class Strike extends BaseBallException{} p

Java编程思想读书笔记_第7章

final关键字类似const: 1 import java.util.*; 2 3 public class FinalData { 4 static Random rand = new Random(47); 5 final int valueOne = 9; 6 final int i4 = rand.nextInt(20); 7 static final int INT_5 = rand.nextInt(20); 8 public static void main(String[] ar

Java编程思想读书笔记_第二章

java对于将一个较大作用域的变量"隐藏"的场景会有保护:编译告警.比如: 1 int x = 5; 2 { 3 int x = 6; 4 } 但是对于类中方法的局部变量和类成员变量确是可以重名的,比如 1 class Test { 2 int x = 4; 3 String s = "hello"; 4 5 void show() { 6 int x = 5; 7 System.out.println(this.x); 8 System.out.println(x

java编程思想读书笔记三(11-21)

十一:持有对象 >持有对象实例 ●数组将数字与对象联系起来.它保存类型明确的对象,查询对象时,不需要对结果做类型转换.他可以是多维的. 可以保存基本的数据类型.但是,数组一旦生成,容量就不会在变. ●Collection保存单一的元素,而Map保存相关联的键值对.有了泛型,你就可以指定存放的对象类型,获取的时候,也不需要类型转换.各种Collection与Map都可以自动调整大小.容器不能持有基本类型.但是会自动包装. ●像数组一样,List也建立数字索引与对象的关联.因此,数组和List都是排

Java编程思想读书笔记--第21章并发

1.基本的线程机制 定义任务 public class LiftOff implements Runnable{ protected int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){} public LiftOff(int countDown){ this.countDown = countDown; } public String