面向对象的思维方法
从学 Java 才真正碰到 OOP。习惯用 C 的人,往往会嫌 Java 慢、代码长、一件小事要拆好多类。抵触很正常;真正别扭的,是不知道该怎么提炼类,一不小心又滑回过程式思路。 面向对象的精髓,是从现实世界的人类思维习惯出发:先谈业务要什么,再翻译成程序能懂的结构。封装的是业务逻辑,不是 sele…
从学 Java 才真正碰到 OOP。习惯用 C 的人,往往会嫌 Java 慢、代码长、一件小事要拆好多类。抵触很正常;真正别扭的,是不知道该怎么提炼类,一不小心又滑回过程式思路。 面向对象的精髓,是从现实世界的人类思维习惯出发:先谈业务要什么,再翻译成程序能懂的结构。封装的是业务逻辑,不是 sele…
Java 是面向对象语言,但八种基本类型并不带对象特性:没有属性、也不能调方法。保留它们是为了符合习惯,并让常规数值运算更简单高效。 引用类型都继承了 Object,转成字符串只要调 toString();基本类型就麻烦得多。为此 Java 给每种基本类型配了一个类,叫做包装类(Wrapper Cl…
声明类、变量和方法时可以用 final 修饰,表示终态:这个东西定下来以后就不能再改继承关系、不能再被覆盖、不能再被重新赋值。 具体规定:final 类不能被继承;final 方法不能被子类重写;final 变量(成员或局部)只能赋值一次,成为常量。 修饰对象 效果 补充 类 不能再派生子类 方法隐…
static 修饰变量或方法,表示它们是静态的:属于类,而不属于某一个对象。 静态变量和静态方法可以通过类名访问,不必先 new 出对象,所以也叫类变量和类方法。实例变量则必须通过对象访问,因为每个对象自己有一份,值可以不同。 对比 静态(类)成员 实例成员 内存 类加载时一份,所有对象共享 每 n…
super 和 this 成对出现:this 表示当前类的实例,super 用来访问父类。 子类里可以用点号取父类的成员变量和方法;方法定义在更上面的祖先类时,Java 会自动向上追溯,直到找到为止。调用看起来就像本类自己的行为一样。 对比 this super 指向 当前对象 不是对象引用,只是让…
this 用来表示当前对象:哪个实例正在执行这段代码,this 就指向谁。通过它可以访问本对象的成员变量和实例方法。 this 只在实例化之后才有意义,静态方法里没有当前对象,因此不能用 this。 常见用法可以先放在一张表里对照: 写法 含义 注意 this.成员 访问当前对象的字段或方法 没有重…
这里说的对象类型转换,只发生在有继承关系的类型之间。没有继承关系却强制转,运行时会抛 java.lang.ClassCastException。 继承链上,子类转成父类叫向上转型,父类转成子类叫向下转型。向上转型很常见:变量写成父类,实际引用子类,运行时靠动态绑定调用子类方法,也就是多态。若要做父类…
多态带来一个实际问题:变量声明类型是父类,怎么判断它实际引用的对象是哪一种?Java 用 instanceof 运算符。 obj instanceof Type 看的是对象的真实类型,不是变量的声明类型。真实对象是 Type 本身,或 Type 的子类,结果为 true。 一、继承链 class P…
面向对象三大特性:封装、继承、多态。封装藏起内部实现,改结构不影响外部用法,也保护数据——外界只看见访问方法。继承为了复用父类代码,同时也给多态铺路。 多态说的是:同一份引用、同一次方法调用,实际跑哪段代码,取决于对象真正的类型。 一、现实生活中的多态 同一个 F1 键:在浏览器窗口打开新网页,在 …
继承里,子类可以改写从父类拿来的方法:名称、返回值类型、参数列表都相同,功能却不同。这就叫覆盖(override)。参数列表(类型、个数、顺序)有一项不同,就不再是覆盖,而可能构成重载(overload)。 覆盖不会把父类方法从内存里删掉,只是对子类实例暂时隐藏。子类里要调用被盖住的父类版本,用 s…