第6章 面向对象(下)

  • 基本类型的包装类
    final修饰
    • 变量 不允许重新赋值
    • 方法 子类不能覆盖
    • 类 不能派生子类
      abstract 抽象类:多个类的模板
      interface 接口:多类应该遵守的规范
      lambda表达式
      enum枚举类:不能自由创建对象的类,对象在定义类时已固定(class季节,能创建的实例有限且确定)

  • 包装类可实现基本类型变量和字符串之间的转换
    字符串 -> 基本类型
    使用包装类的方法
  1. 静态方法 parseXxx(String s) 除了Character
  2. 构造器 Xxx(String s)
    基本类型 -> 字符串
    String.valueOf(x);
    基本类型+"";
String intStr = "123";
int it1 = Integer.parseInt(intStr);
int it2 = new Integer(intStr);
String s = String.valueof(true);
String str = 基本类型 + "";

系统把-128~127存在cache数组,所以不用新建对象。

//ina == inb
Integer ina = 2;
Integer inb = 2;
//biga != bigb
Integer biga = 128;
Integer bigb = 128;

所以包装类都有一个compare方法
Boolean.compare(true, false); true> false输出1

6.2处理对象

打印对象和toString方法
object类提供的toString方法返回“类名+@+hashCode”

string不能用==判断,要用equals
new String("hello");一用产生两个字符串对象(“hello”在常量池)
在编译时就能确定下来的,在常量池,不产生多个副本

6.3类成员

static修饰的成员:类变量,类方法,初始化块,不能修饰构造器

java类中只包含5种成员

  1. 成员变量
  2. 方法
  3. 构造器 ×
  4. 初始化块
  5. 内部类(接口,枚举)
    除了3都可以用static修饰
    类成员不能访问实例成员
6.3.2单例类

只允许创建一个实例的类,构造器private

6.4final

final修饰的成员变量必须由程序员显式的指定初始值,系统不会隐式初始。
6.4.4可执行“宏替换”的final变量
final变量相当于一个常量:
使用final && 定义final变量时指定了初始值 && 该初始值在编译时就被确定下来了。

  • fina方法不能被重写: Object getClass()
  • final类不能有子类(不能被继承)
6.4.7不可变类

类中只有setter没有getter
但是类的组合的时候 a由b组成,需要new b 传入a,此时b改变了,会改变a的值(图
在a中
private final Name name;
构造函数 this.name = new Name(name.getName()) //new一个新的
getter中返回一个 return new Name(name.getName());防止把成员变量返回出去被修改。

6.4.8缓存实例的不可变类
codes\06\6.4\CacheImmututaleTest.java
codes\06\6.4\IntegerCacheTest.java
6.5抽象类 一种模板模式的设计

抽象类和抽象方法:抽象类里可以没有抽象方法,抽象方法必须在抽象类里。

  • 抽象方法不能有方法体
  • 抽象类不能被实例化
    得 抽象方法,失 创建实例
package six;

public abstract class Shape {
    {
        System.out.println("执行shape的初始化块");
    }
    public abstract double calPerimeter();
    public abstract String getTYpe();
    private String color;
    public Shape(){}
    public Shape(String color) {
        System.out.println("执行shape的构造器");
        this.color = color;
    }
}
-------------------------------------
package six;

public class Triangle extends Shape {
    private double a;
    private double b;
    private double c;
    public Triangle(String color, double a, double b, double c) {
        super(color);
        this.setSides(a, b, c);
    }
    public void setSides(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    public  double calPerimeter() {
        return a + b + c;
    }
    public  String getTYpe() {
        return "三角形";
    }
    public static void main(String[] args) {
        Shape s1 = new Triangle("red", 3, 4, 5);
        System.out.println(s1.getTYpe());
        System.out.println(s1.calPerimeter());
    }
}

使用abstract修饰类时,表明这个类只能被继承,使用abstract修饰方法时,表明这个方法必须由子类提供实现(重写)
final永远不能和abstract同时使用。
static 和 abstract 不能同时修饰某方法。没有类抽象方法,但可以同时修饰内部类。
private和abstract不能同时修饰方法。

接口:修饰符 省略/public

不包含构造器,初始化块

  • 成员变量(only静态常量)自动增加public static final修饰
    public static final int MAX_SIZE = 50;
  • 方法 (only抽象实例方法,类方法,默认方法default修饰)public abstract
  • 内部类(内部接口,枚举)public static
    接口可被当做一个特殊的类,java 源文件中最多只能有一个public接口。
    默认方法必须使用default修饰,不能用static修饰,不能直接使用借口来调用,使用接口的实现类的实例来调用。
package six.lee;

public interface Output {
    //接口里的成员变量默认public static final !!!
    int MAX_CACHE_LINE = 50;
    //接口里的普通方法默认public abstract
    void out();
    void getData(String msg);
    //在接口中定义默认方法,需要使用default修饰
    default void print(String... msgs) { //神奇的用法...
        for (String msg : msgs) {
            System.out.println(msg);
        }
    }
    //在接口中定义默认方法,需要使用default修饰
    default void test() {
        System.out.println("默认的test()方法");
    }
    //接口里定义的类方法,需要static修饰
    static String staticTest() {
        return "接口里的类方法";
    }
}
-----------------
package six.yeeku;

public class OutputFieldTest {
    public static void main(String[] args) {
        System.out.println(six.lee.Output.MAX_CACHE_LINE);
        //Output.MAX_CACHE_LINE = 20;   不能为final变量赋值
        System.out.println(six.lee.Output.staticTest());

    }
}
输出:
50
接口里的类方法
接口的继承

相当于继承了一个彻底的抽象类(除了默认方法,所有方法都是抽象abstract方法)

使用接口:

不能创建实例,但可以用于声明引用类型变量,指向其实现类的对象
接口用途:

  1. 定义变量,进行强制类型转换
  2. 调用接口中定义的常量
  3. 被其他类实现
  • 实现接口方法时,必须用public
package six.lee;

public interface Output {
    //接口里的成员变量默认public static final
    int MAX_CACHE_LINE = 50;
    //接口里的普通方法默认public abstract
    void out();
    void getData(String msg);
    //在接口中定义默认方法,需要使用default修饰,不能用static修饰,不能直接用接口调用,要用实现类的对象调用
    default void print(String... msgs) {
        for (String msg : msgs) {
            System.out.println(msg);
        }
    }
    //在接口中定义默认方法,需要使用default修饰
    default void test() {
        System.out.println("默认的test()方法");
    }
    //接口里定义的类方法,需要static修饰
    static String staticTest() {
        return "接口里的类方法";
    }
}
-------------------------------
package six.lee;

interface Product {
    int getProduceTime();
}
public class Printer implements Output, Product{

    private String[] printData = new String[MAX_CACHE_LINE];
    private int dataNum = 0;

    //实现接口的方法必须加上public,不能省略
    public void out() {
        while (dataNum > 0) {
            System.out.println("打印机打印:" + printData[0]);
            System.arraycopy(printData, 1, printData, 0, --dataNum);
        }
    }
    public void getData(String msg) {
        if (dataNum >= MAX_CACHE_LINE) {
            System.out.println("输出队列已经满了,添加失败");
        } else {
            printData[dataNum++] = msg;
        }
    }
    public int getProduceTime() {
        return 45;
    }
    public static void main(String[] args) {
        Output o = new Printer();
        o.getData("猪猪侠");
        o.getData("中二少年");
        o.out();
        o.getData("我的");
        o.getData("什么是AJAX");
        o.out();
        o.print("白敬亭", "小白", "陆之昂");
        o.test();
        Product p = new Printer();
        System.out.println(p.getProduceTime());
        Object obj = p;


    }
}
输出:
打印机打印:猪猪侠
打印机打印:中二少年
打印机打印:我的
打印机打印:什么是AJAX
白敬亭
小白
陆之昂
默认的test()方法
45
6.6.5接口和抽象类

接口总纲,抽象类中间产品

6.6.6面向接口编程

设计模式:对经常出现的软件设计问题的成熟解决方案,实际上是对特定问题的一种惯性思维。理解好必须要有代码积累量。

1. 简单工厂模式
2. 命令模式 interesting

某方法 完成 某行为,该行为的具体实现必须等执行时才确定。

  • java8中通过Lambda表达式可以传入代码块作为参数。
public interface Command {
    //普通方法 public abstract
    void process(int[] target);
}
----------------------
public class ProcessArray {
    void process(int[] target, Command c) {
        c.process(target);
    }
}
------------------------
public class PrintCommand implements Command{
    public void process(int[] target) {
        for (int i : target) {
            System.out.println("迭代打印数组元素" + i);
        }
    }
}
-------------------------
public class AddCommand implements Command{
    public void process(int[] target) {
        int sum = 0;
        for (int i : target) {
            sum += i;
        }
        System.out.println("数组总和" + sum);
    }
}
-----------------------------
public class CommandTest {
    public static void main(String[] args) {
        ProcessArray p = new ProcessArray();
        int[] arr = {1, 2, 3, 4, 5};
        p.process(arr, new AddCommand());
        p.process(arr, new PrintCommand());
    }
}
输出:
数组总和15
迭代打印数组元素1
迭代打印数组元素2
迭代打印数组元素3
迭代打印数组元素4
迭代打印数组元素5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,558评论 18 399
  • 以下是《疯狂Java讲义》中的一些知识,如有错误,烦请指正。 Java8增强的包装类 自动装箱就是把一个基本类型的...
    hainingwyx阅读 387评论 0 0
  • Advanced Language Features 知识点:一. static修饰符 static修饰符可以用来...
    风景凉阅读 429评论 0 0
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,184评论 0 5
  • 去年由于项目压力过大,我深深着迷于《皇室战争》这款游戏。 每晚到家往沙发上一窝,可以决战到凌晨,丝毫不知疲倦。 这...
    遇见嘉树阅读 319评论 20 37