构造方法基本概念

构造方法是类中的一种特殊方法

它是在类创建对象(实例化)的时候自动调用的方法

这个和python中的__init__初始化魔术方法类似

可以在创建对象的时候进行参数的传递

默认送您的构造

一个类编译过后都需要有一个构造方法.如果程序中没有写的话

编译器在编译时就会帮你加上一个无参数的空的构造方法(称之为”默认的构造方法”)

那要是你定义了构造方法了,编译器也不欠欠的帮你加了,它也懒

关于构造的建议

  • 当类中有成员变量,并且还不是常量的时候,建议提供两个版本的构造方法,一个无参数的构造,一个全属性的构造

  • 而类中所有成员变量都是常量或者干脆就没有成员变量的时候,建议不要写构造

成员方法重载

说白了就是同样名称的方法,可以有很多不同参数列表的版本,有的有参数,有的没有参数,而方法名一样

这样官方说能让类的设计变的更加优雅,我是没看出来

好像是能够一个方法处理不同的数据

这样的设计方式成为重载设计

this关键字

this就是代表对象本身(调用该方法的对象)
就像JavaScript中的this
就像python中的self

OOP三大特性之封装

封装的面向对象的三大特性之一,

如果代码不做限制,则很多属性值是无效的

封装就是保证属性值有效的技术

封装的步骤

  1. 属性(不是常量的)必须使用private修饰,确保外部变量无法直接进行赋值操作

  2. 提供操作属性的方法,一般都是读写属性方法,get属性和set属性方法

  3. 构造方法中,也要通过调用set和get方法来操作

static关键字

静态static关键字修饰属性或者方法

可以将对象层级从对象级升级成为类级别,在类加载的时候就可以调用准备好的属性或者方法

换句话说就是static修饰的可以直接进行调用

单例设计模式

设计模式是形成标准化流程的经验总结,是特定问题的固定的解决方案

单例设计思路:

1
2
3
1. 先private构造,阻止外部去创建对象
2. 本类提供一个对象,定义一个private static 的本类类型的属性
3. 对外提供get方法,将唯一的对象返回到外部

单例分为饿汉式和懒汉式两种写法

java中单例模式是一种常见的设计模式,在实际开发中比较常用
具体详细内容可以参考:Java设计模式之单例模式

OOP三大特性之继承

继承就是子类复用父类的代码

使用关键字extends表示类和类之间的继承关系

1
2
3
class Son extends Father{
// ...
}

Java中不能多继承,可以通过接口的多实现来弥补类的多继承

继承中的构造方法

子类必须通过super();关键字才能调用父类中的构造方法

这样才能好好的初始化来自父类的成员变量

this()super()必须出现在构造的第一行,因此不可能同时出现

方法的重写

  • 有些父类写好的方法,子类它不太喜欢

子类就可以使用方法重写(覆盖)来改变他爸爸给他的方法

  • 方法重写的原则:
    1
    2
    3
    1. 相同的方法名称,相同的参数列表,相同的返回值类型或者返回子类
    2. 访问权限不能变小,可以变大
    3. 不能抛出更大的异常
  • 在子类重写的方法中,可以通过super关键字调用父类的”原始”方法.
  • static 方法重写之后还是static

访问控制修饰符的对比

OOP三大特性之多态

一母生九子,九子各不同

1
Person p = new Student();
  1. 只能使用母类中定义的属性和方法
  2. 不能直接使用子类中扩展的属性和方法
  3. 如果子类重写了方法,静态方法调父类的,非静态方法调子类的
    原因:
    编译时,p被认为是Person类型;但在运行时是Student类型.在内存中其实是子类对象.

总结:
子即为多态

多态特点

多态时,如果想要把扩展的属性和方法调用出来,需要做类型转换

父类子类需要做强制类型转换(向转型)
子类父类需要做强制类型转换(向转型)

对象强制类型转换是一种还原行为,必须内存中是该类型的对象才能成功

instanceof运算符

instanceof就是判断对象的类型,如果是该类型返回true,不是返回false

语法格式:

1
2
3
对象 instanceof 类型
obj instanceof Object
p instanceof Person

严格的来说,在进行对象的向下转型之前,都得instanceof一下才能

这个instanceof必须发生在父子之间才行哦!

抽象类

用abstract修饰的类,这个类吧就厉害了

它不能实例化,这可咋用啊

唉,对 就是用来继承的,你不能实例化你儿子行啊

抽象方法所在类必须是抽象类,而子类如果不是抽象类,一定要重写父类中的抽象方法才行(实现父类的方法体)