- 构造方法基本概念
- 默认送您的构造
- 关于构造的建议
- 成员方法重载
- this关键字
- OOP三大特性之封装
- 封装的步骤
- static关键字
- 单例设计模式
- OOP三大特性之继承
- 继承中的构造方法
- 方法的重写
- 访问控制修饰符的对比
- OOP三大特性之多态
- 多态特点
- instanceof运算符
- 抽象类
构造方法基本概念
构造方法是类中的一种特殊方法
它是在类创建对象(实例化)的时候自动调用的方法
这个和python中的__init__
初始化魔术方法类似
可以在创建对象的时候进行参数的传递
默认送您的构造
一个类编译过后都需要有一个构造方法.如果程序中没有写的话
编译器在编译时就会帮你加上一个无参数的空的构造方法(称之为”默认的构造方法”)
那要是你定义了构造方法了,编译器也不欠欠的帮你加了,它也懒
关于构造的建议
-
当类中有成员变量,并且还不是常量的时候,建议提供两个版本的构造方法,一个无参数的构造,一个全属性的构造
-
而类中所有成员变量都是常量或者干脆就没有成员变量的时候,建议不要写构造
成员方法重载
说白了就是同样名称的方法,可以有很多不同参数列表的版本,有的有参数,有的没有参数,而方法名一样
这样官方说能让类的设计变的更加优雅,我是没看出来
好像是能够一个方法处理不同的数据
这样的设计方式成为重载设计
this关键字
this
就是代表对象本身(调用该方法的对象)
就像JavaScript
中的this
就像python
中的self
OOP三大特性之封装
封装的面向对象的三大特性之一,
如果代码不做限制,则很多属性值是无效的
封装就是保证属性值有效的技术
封装的步骤
-
属性(不是常量的)必须使用private修饰,确保外部变量无法直接进行赋值操作
-
提供操作属性的方法,一般都是读写属性方法,get属性和set属性方法
-
构造方法中,也要通过调用set和get方法来操作
static关键字
静态static关键字修饰属性或者方法
可以将对象层级从对象级升级成为类级别,在类加载的时候就可以调用准备好的属性或者方法
换句话说就是static修饰的可以直接进行调用
单例设计模式
设计模式是形成标准化流程的经验总结,是特定问题的固定的解决方案
单例设计思路:
1. 先private构造,阻止外部去创建对象
2. 本类提供一个对象,定义一个private static 的本类类型的属性
3. 对外提供get方法,将唯一的对象返回到外部
单例分为饿汉式和懒汉式两种写法
java中单例模式是一种常见的设计模式,在实际开发中比较常用 具体详细内容可以参考:Java设计模式之单例模式
OOP三大特性之继承
继承就是子类复用父类的代码
使用关键字extends表示类和类之间的继承关系
class Son extends Father{
// ...
}
Java中不能多继承,可以通过接口的多实现来弥补类的多继承
继承中的构造方法
子类必须通过super();
关键字才能调用父类中的构造方法
这样才能好好的初始化来自父类的成员变量
this()
和super()
必须出现在构造的第一行,因此不可能同时出现
方法的重写
- 有些父类写好的方法,子类它不太喜欢
子类就可以使用方法重写(覆盖)来改变他爸爸给他的方法
- 方法重写的原则:
1. 相同的方法名称,相同的参数列表,相同的返回值类型或者返回子类 2. 访问权限不能变小,可以变大 3. 不能抛出更大的异常
- 在子类重写的方法中,可以通过
super
关键字调用父类的”原始”方法. static
方法重写之后还是static
的
访问控制修饰符的对比
OOP三大特性之多态
一母生九子,九子各不同
Person p = new Student();
- 只能使用母类中定义的属性和方法
- 不能直接使用子类中扩展的属性和方法
- 如果子类重写了方法,静态方法调父类的,非静态方法调子类的 原因: 编译时,p被认为是Person类型;但在运行时是Student类型.在内存中其实是子类对象.
总结:
左
父右
子即为多态
多态特点
多态时,如果想要把扩展的属性和方法调用出来,需要做类型转换
父类
转子类
需要做强制类型转换(向下
转型)
子类
转父类
需要做强制类型转换(向上
转型)
对象强制类型转换是一种还原行为,必须内存中是该类型的对象才能成功
instanceof运算符
instanceof
就是判断对象的类型,如果是该类型返回true
,不是返回false
语法格式:
对象 instanceof 类型
obj instanceof Object
p instanceof Person
严格的来说,在进行对象的向下转型之前,都得instanceof一下才能
这个instanceof必须发生在父子之间才行哦!
抽象类
用abstract修饰的类,这个类吧就厉害了
它不能实例化,这可咋用啊
唉,对 就是用来继承的,你不能实例化你儿子行啊
抽象方法所在类必须是抽象类,而子类如果不是抽象类,一定要重写父类中的抽象方法才行(实现父类的方法体)