java 面向对象落地法则(二)

94 阅读5分钟

一. this:

1. 可以用来修饰属性、方法、构造器
2. this 理解为当前对象或当前正在创建的对象. 比如: this.name, this.show()
3. 可以在构造器中通过"this(形参)"的方式显式的调用本类中其他重载的指定的构造器
要求:
	1. 在构造器内部必须声明在首行
    	2. 若一个类中有n个构造器, 那么最多有n-1个构造器中使用了this()
        

二. super:

1. 可以用来修饰属性、方法、构造器
2. 当子类与父类中有同名的属性时, 可以通过"super.属性"显式的调用父类中声明的属性, 若想调用子类的同名的属性"this.属性"
3. 当子类重写父类的方法后, 在子类中若想再显式的调用父类的被重写的方法, 就需要使用"super.方法"
4. super修饰构造器: 通过在子类中使用"super(形参列表)"来显式的调用父类中指定的构造器
	① 在构造器内部. "super(形参列表)"必须要声明在首行
    	② 在构造器内部. "this(形参列表)""super(形参列表)"只能出现一个
    	③ 当构造器中, 不显式的调用"this(形参列表)""super(形参列表)"其中任何一个, 默认调用的时父类空参的构造器
    

this 和 super 的区别

No.区别点thissuper
1访问属性访问本类中的属性, 如果本类没有此属性,则从父类中继续查找访问父类中的属性
2调用方法访问本类中的方法直接访问本类中的方法
3调用构造器调用本类构造器, 必须要放在构造器的首行调用父类构造器, 必须放在子类构造器的首行
4特殊表示当前对象无此概念

建议: 设计一个类时, 尽量要提供一个空参的构造器

static(静态的)

可以用来修饰属性, 方法, 初始化块, 内部类

1 static修饰属性(类变量):
	① 由类创建的所有的额对象, 都共用一个属性
    	② 当其中一个对象对此属性进行修改, 会导致其他对象对此属性的一个调用. 实例变量(非static修饰的属性, 各个对象各自拥有一套副本)
        ③ 类变量随着类的加载而加载, 而且独一份
        ④ 静态的变量可以直接通过"类.类变量"的形式来调用
        ⑤ 类变量的加载要早于对象, 所以当有了队形之后, 可以"对象.类变量"使用, 但是"类.实例变量"事不行的
        ⑥ 类变量存在于静态域中
        
2 static修饰方法(类方法)
	① 随着类的加载而加载,在内存中也是独一份
    	② 可以直接同通过"类.类方法"的方式调用
    	③ 内部可以调用静态的属性或静态的方法, 而不能调用非静态的属性或方法. 反之, 非静态的方法事可以调用静态的属性或方法的
    

注: ① 静态的结构(static的属性, 方法, 代码块, 内部类)的生命周期要早于非静态的结构, 同时被回收也要晚于非静态结构. ② 静态方法内是不可以有this或super关键字的

final(最终的):

可以用来修饰类、属性、方法

1. 修饰类: 这个类就不能被继承 (如: String类、StringBuffer类、System类)

2. 修饰方法: 这个方法不能被重写 (如: Object类的getClass())

3. 修饰属性: 此属性就是一个常量, 一旦初始化后, 不能再被赋值; (习惯上, 常量用大写字符表示)
此常量在那里赋值: ① 磁场两不能使用默认初始化 ② 可以显式的赋值 ③ 可以显式的赋值、代码块、构造器

变量用 static final 修饰: 全局常量

与 finally finalize() 区分开(没啥关系,只是长得像仅此而已)

abstract(抽象的)

可以用来修饰类、修饰方法 不能用来修饰属性、构造器、private、final、static

1. 修饰类: 抽象类
	① 不可被实例化
	② 抽象类有构造器(凡是类都有构造器)
    	③ 抽象方法所在的类, 一定是抽象类
    	④ 抽象类中可以没有抽象方法

2. 修饰方法: 抽象方法
	① 格式: 没有方法体. 包括{} 
    		如: public abstract void change();
    ② 抽象方法只保留方法的功能. 而具体的执行, 交给继承抽象类的子类, 由子类重写此抽象方法
    ③ 若子类继承抽象类, 并重写类所有的抽象方法, 则此类是一个"实体类", 既可以实例化
    ④ 若子类继承抽象类, 没有重写所有的抽象方法, 意味着次类中仍有抽象方法, 则此类必须声明为抽象的
    

interface(接口)

接口是与类并行的一个概念 (接口与具体的实现类之间也存在多态性)

1. 接口可以看作是一个特殊的抽象类, 是常量与抽象方法的一个集合
2. 接口时没有构造器的
3. 接口定义的就是一种功能(此功能可以被类所实现(implements), 如: class Student extends Person implements university)
4. 实现接口的类, 必须要重写其中所有的抽象方法, 方可实例化. 若没有重写所有的抽象方法, 则此类仍为一个抽象类
5. 类可以实现多个接口(----java 中类的继承是单继承的)
6. 接口与接口直接也是继承关系(接口可以实现多继承)
注: 56描述的是java中的继承的特点