第九天2018.8.8

今日任务
1.内部类
2.设计模式
3.基本数据类型及其包装类

1.内部类

1.1成员内部类

作为外部类的成员而存在,与成员变量和成员方法评级

1,2局部内部类

作为局部成员存在,和局部变量评级
在jdk1.7之前不能访问成员变量,只能访问常量。这是为了防止之后的代码改变数值而影响该类
如果内部类中有和外部类中同名的变量,则智能访问内部类中的变量

1.3静态内部类

使用static修饰,和外部类平级。
静态内部类存在的意义在于为外部类提供功能。
也就是说,她稚嫩访问外部类中的静态成员

1.4匿名内部类

函数式接口(只有一个方法的接口)可以用lambda表达式

//不使用lambda的代码
Inner3 inner3 =new Inner3() {
    public void show() {                    
        System.out.println("in Inner3");
    }
}

接口名 变量名 =() ->接口内方法的实现语句;多句执行语句用大括号括住。

//使用lambda的代码
Inner3 inner3 = () -> System.out.println("in "+string);

如果只有return可以不用写return。如果括号里有参数,可以直接写实参,省去括号

//使用之前
Inner3 inner3 =new Inner3() {
    public void show(String string) {
        System.out.println("in "+string);
    }
};
//使用之后

2.设计模式

2.1单例设计模式

单例设计方式有两种,懒汉式和饿汉式
两者的核心思路都是将构造方法私有化,然后用静态方法返回出静态的对象,注意判断是否为空来进行new。
懒汉式

public class OnlyOne {
//  懒汉式
    private static OnlyOne onlyOne;
    /**
     * 
     */
    private OnlyOne() {}

    public OnlyOne getOnlyOne() {
    //  懒汉式
        if (onlyOne==null) {
            onlyOne=new OnlyOne();
    }
        return onlyOne;
    }

}

懒汉式在多线程的情况下会存在线程安全问题。但在第一次时创建时可以节省时间
饿汉式

public class OnlyOne {  
    private static OnlyOne onlyOne =new OnlyOne();
    /**
     * 
     */
    private OnlyOne() {}

    public OnlyOne getOnlyOne() {
        return onlyOne;
    }

}
2.2简单工厂设计模式

在多态的情况下使用工厂类对于所有子类的创建逻辑进行集合通过判断返回对应的子类

public Food cook(int chooseNumber) {
        Food choosed = null;
        switch (chooseNumber) {
        case 1:
            choosed = new Huamboger();
            break;
        case 2:
            choosed = new Swatch();
            break;
        default:
            break;
        }
        choosed.cook();
        return choosed;
    }
2.3工厂方法

使用一个抽象的工厂基类将一个工程再度向下细化

2.4抽象工厂

在过度细分的工厂类之上加一个基类以实现批量修改

3.基本数据类型与其包装类

从jdk1.5之后,Java可以实现自动拆箱和装箱,可以直接赋值不用再使用new 和intvalue方法。

        Integer a = new Integer(100);
        Integer b = new Integer(100);
        System.out.println("a==b:"+(a==b));

在这里的结果是false,因为==比较的是占中的值也就是地址。使用new方法是在堆中创建新的空间进行存值

        Integer a = 100;
        Integer b = 100;
        System.out.println("a==b:"+(a==b));

而这个则是true,因为自动装箱相当于调用了Integer的valueof方法,而valueof方法则是调用的Integer缓存区中的方法,代码中的两个是缓存区上同一个地址的值。不过需要注意,这个缓存区是从-127到128.这个范围以外的数仍然是false
Integer。parseInt()可以有两个参数,前一个是需要转的字符串,后一个则是进制

4.读书笔记

1.需要注意的是,在执行三木运算时,如果冒号前后类型不一致,会进行自动类型转换。另外,当常量和字符在一起时,显示字符,而变量则会显示字符的ASCII编码。

猜你喜欢

转载自blog.csdn.net/qq_34939549/article/details/81512013