欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【学习笔记】《Java编程思想》 第8~11章,

来源: javaer 分享于  点击 27347 次 点评:68

【学习笔记】《Java编程思想》 第8~11章,


第八章 多态

第九章 接口

第十章 内部类

public interface Contents {
    int value();
}
public class Parcel7 {
    public Contents contents() {
        return new Contents() {
            private int i = 1;
            public int value() { return i; }
        };
    }

    //等价于
/*
    class MyContents implements Contents {
        private int i = 1;
        public int value() { return i; }
    }
    public Contents contents() { return new MyContents(); }
*/

    public static void main(String[] args) {
        Parcel7 parcel7 = new Parcel7();
        Contents c = parcel7.contents();
    }
}

给匿名内部类传递参数时,若该形参在内部类被使用,那么该形参必须被声明为final

public class Parcel9 {
    //dest是一个在外部定义的对象,必须将其定义为final参数引用
    public Destination destination(final String dest) {
	return new Destination() {
	    private String label = dest;
	    @Override
	    public String readLabel() {
                return label;
	    }
	};
    }
    public static void main(String[] args) {
	Parcel9 parcel9 = new Parcel9();
	Destination destination = parcel9.destination("Shanghai");
	System.out.println(destination.readLabel());
    }
}
  • 为什么要是final?内部类并不是直接调用方法传递的参数,而是利用自身的构造器对传入的参数进行备份,自己内部方法调用的实际上是自己的属性而不是外部方法传递进来的参数,在内部类中的属性和外部方法的参数两者看似是同一个东西,但实际上却不是,也就是说在内部类中对属性的修改并不会影响到外部的形参,如果内部类中的属性改变了,而外部方法的形参却没有改变,这是难以接受的,为了保证参数的一致性,就规定使用final来避免两者不同时变化的情况发生。
  • 每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息;内部类也必须生成有个.class文件以包含它们的class对象信息,其命名规则是:

    外围类的名字,加上”$“,再加上内部类的名字,如果时匿名内部类,编译器会简单地产生一个数字作为其标识符,例如:

    Outer$Inner.class
    Outer$1.class
  • 第十一章 持有对象

  • LinkedList常见方法

    addFirst(E e)/addLast(E e):将元素添加到列表的开头/结尾

    getFirst()/element():返回列表的第一个元素

    peek()/peekFirst():获取但不移除列表的第一个元素

    offer(E e)/offerLast(E e):将元素插入到列表末尾

  • Queue

    队列时一个典型的先进先出(FIFO)的容器,即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是一样的

    LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现,也可以将LinkedList向上转型为Queue

  • Set

    Set不保存重复的元素;Set最常被使用的是测试归属性,我们可以很容易地询问某个对象是否在某个Set中

    存储元素的方式:

    HashSet:使用散列函数

    LinkedHashSet:使用散列,但是看起来使用了链表来维护元素的插入顺序

    TreeSet:将元素存储在红-黑树结构中

  • Map:一组成对的“键值对”对象,允许使用键来查找值;映射表允许我们使用另一个对象来查找某个对象,它被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起,或者被称为“字典”

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();

    更复杂的形式

    Map<Integer, List<String>> map = 
                                   new HashMap<Integer, List<String>>();
    map.put(1, rrays.asList("lv", "long", "bao"));

    map的键是一个Set,值是一个Collection

    Map常见方法

    get(Object o):返回指定键所映射的值,如果不包含该键的映射关系,返回null

    put(K key, V value):将指定的值与此映射中的指定键关联,如果已经存在映射关系,更新值

    hashCode():返回此映射的哈希码值

    Map的三种实现

    HashMap:基于“拉链法”实现的散列表,一般用于单线程中,不是线程安全的

    HashTable:基于“拉链法”实现的散列表,一般用于多线程中,是线程安全的

    TreeMap:有序的散列表,通过红黑树实现的,一般用于单线程中存储有序的映射

  • 总结:
  • 相关文章

      暂无相关文章
    相关栏目:

    用户点评