集合、泛型、线程、final、回调

来源:互联网 发布:全景拼图软件 编辑:程序博客网 时间:2024/05/05 07:53

健表与健值对

List
list.add(i); // 添加值
list.get(i); // 获得值

Map
map.put(“test”, “test”); // 添加
map.get(“test”); // 获得值

提示:有时间把相应的增删改查整理出来


泛型

泛型的好处

1、类型安全
a)假如没有明确具体类型,存入不同类型的数据不会报错,但取出来时因为类型不同可能会出错
b)明确了具体类型(泛型的作用),可以存入统一类型的数据
2、不需要强制转换


泛型实例题目

实现了一个泛型描述接口,来描述不同类型的类


代码

/** * 描述接口 * @author Administrator * * @param <T> */public interface Desc<T> {    public void desc(T p);}
/** * 书类 *  * @author Administrator * */public class Book implements Desc<Book> {    private String name;    private String author;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }    public Book(String name, String author) {        this.name = name;        this.author = author;        // 输出一下书的信息        desc(this);    }    /**     * 图书描述     */    @Override    public void desc(Book book) {        String result = book.toString();        System.out.println(result);    }    @Override    public String toString() {        return "这本书的名字是" + getName() + ";作者是" + getAuthor();    }}
/** * 人类 *  * @author Administrator * */public class Person implements Desc<Person> {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Person(String name) {        this.name = name;        // 输出一下该类的内容        desc(this);    }    /**     * 人的描述     */    @Override    public void desc(Person p) {        String str = p.toString();        System.out.println(str);    }    @Override    public String toString() {        return "我的名字是" + this.getName();    }}
public class Test {    public static void main(String[] args) {        Person p = new Person("张三");        Book book = new Book("水浒传", "施耐庵");    }}

执行结果

我的名字是张三
这本书的名字是水浒传;作者是施耐庵


线程与并发


调用线程的run方法和start方法的区别

  1. new Thread(){}.start方法: 与其它线程并发执行,互不干涉
  2. new Thread(){}.run方法的区别 与其它线程串形实行,一个接着一个

并发

多个客户端对服务器同时发出请求,服务器为每个客户端new一个线程,导致并发


“值不可改变”final关键字的理解

  1. 基本类型:一经赋值,内容无法改变。
    例如:final int i = 3; i = 5; //错误,内容无法改变
  2. 引用类型:一经赋值,引用指向的位置不可以改变。
    例如:final Person p=new Person() ; //p指向的Person()成员属性与方法可以改变 p = new Person() // 错误,引用指向位置不可改变

Java回调


通俗易懂定义

有些事情,是一个线程无法自己完成,需要借助别的力量完成,可是不知道何时借助,所以出现了回调


题目

发生了一桩偷窃案,警官把偷窃案交给了柯南,柯南找了很久,发现了真相,打电话告诉了警官,警官抓住了贼

分析

柯南虽然可以找到真相,但他无法抓贼,那不是他的本职,且也无法知道何时能找到真相

代码


/** * 电话接口 * @author Administrator * */public interface Phone {    /**     * 打电话     */    public void call();}
/** * 警官类 * @author Administrator * */public class Police {    /**     * 抓贼     */    public void catchThief(){        System.out.println("警察抓到了小偷,且将其刑之与法");    }}
public class Detective extends Thread {    private Phone Phone;    /**     * 开一个线程开始查找真凶,找到了就打电话给警官     */    @Override    public void run() {        try {            System.out.println("柯南花了一段时间破案...");            sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("柯南发现了真相,并打电话给警官");        Phone.call();    }    public Phone getPhone() {        return Phone;    }    public void setPhone(Phone phone) {        Phone = phone;    }}
public class Main {    public static void main(String[] args) {        System.out.println("发生了一起偷窃案");        Police police = new Police();        Detective kenan = new Detective();        // new phone() 就是所谓的回调        kenan.setPhone(new Phone() {            @Override            public void call() {                // 打电话给警官                police.catchThief();            }        });        kenan.start();    }}

执行结果

发生了一起偷窃案
柯南花了一段时间破案…
柯南发现了真相,并打电话给警官
警察抓到了小偷,且将其刑之与法

1 0
原创粉丝点击