第5章、面向对象(上)
-
命名规则
- 都要由有意义的单词组成
- 类名,每个单词的首字母大写 (Student
- 成员变量名,首单词字母小写,每个单词首字母大写(phoneNumber
- 方法名,首单词字母小写,动词开头 (goOut
- 都要由有意义的单词组成
-
static关键字
- 修饰的是类属成员变量和方法,是类共有的,通过类进行调用。
- 特别是静态成员变量,是类属的,所有对象共享的(不建议对象调用静态变量和方法)
- 因此,规范:使用类名去调用类属方法与变量
- 否则就是对象所有的(称为实例变量、实例方法)
- 因此,静态方法不能直接调用或访问非静态成员
- static本质作用是区分 变量、方法是属于类还是属于实例对象的
- 修饰的是类属成员变量和方法,是类共有的,通过类进行调用。
-
Person p = new Person()
- 实际上p是一个指针变量(也称引用变量),保存着实际对象的地址
- p变量存在栈内存,对象存在堆内存
- 只能通过指针p来访问对象
- 当没有任何指针变量指向 堆内存中的对象 时,该对象会被JVM的回收机制回收
- 因此,如果想销毁某对象,只需要将指向他的指针变量置null即可
-
this
- 哪个对象在调用该方法,this就代表哪个对象
- 一个成员函数调用另一个成员函数太过普遍,因此此时this可省略
- static的方法不能使用this
- 可使用this做返回值 ,返回对象本身
-
方法
- 在面向结构的编程语言中,函数是基本单位
- 但在Java中,类才是。因此方法不能独立存在,只能属于类当中
- java中,参数传递的只有值。传入对象时,传递的是指针
-
参数个数可变的方法
- public void test(int a, String… books){
for( String tmp :books){
sout(tmp);
}
}
-
此时可以传入多个book
-
访问控制符
- private 只能在当前类内部被访问
- default 默认,包访问权限,可以被相同包下的其他类访问
- protected 子类访问权限,不仅可以被相同包下的其他类访问,还可以被不同包中的子类访问
- 用于那种:仅希望被子类重写,而不想被外界直接调用的方法
- public 公共访问权限
-
package
- 提供了类的多层次命名空间,用于解决类的命名冲突、类文件管理等
- 将同一组功能相关的类放在同一包下,形成逻辑上的类库单元
- 包结构
- cn.ac.iie.cloud等
- kensin.projectname
-
import
- import package 导包后,调用某个类就不用加包名前缀了
- import static 某类 ,导入后,可以直接调用那个类当中的静态变量与方法,可省略类名
-
构造器
- 可以使用this()在一个重载的构造器中调用另一个构造器,但必须作为构造器执行体的第一条语句
-
类的继承
- extends 意为拓展的意思,即子类是父类的拓展,但确实也继承得到了父类的成员
- java类只能有一个直接父类,但却可以有无限多个简介父类
- 所有的类都默认继承自java.lang.Object
- 子类可以可以重写覆盖父类当中的方法,如果调用父类中被子类覆盖的方法:super.即可
- super用于调用子类继承自父类的成员变量与方法
- 重载是在同一个类当中的同名方法,重写是子类重写父类当中的同名方法
- 在子类的构造器中,可显式调用父类的构造器 super( , )
- 父类的构造器总是在子类的构造器之前执行
-
多态
- 相同类型的变量,在调用同一个方法时呈现出多种不同的行为特征,这就是多态
- 例如基类是打印机printer
- Printer p1=new CaisePrinter
- Printer p2=new HeibaiPrinter
- 此时调用p1,p2的打印方法,打印出来不同的效果,即多态
- instanceof 判断前面的对象是否是后面的类,或者其子类、实例类的实例
- 一般在强转之前,判断是否可以成功转换,以避免ClassCastException
-
继承与组合
-
封装:类应当封装他的内部信息和实现细节,而只暴露必要的方法给其他类使用。(低耦合)
-
但继承会破坏父类的封装性,甚至都可以重写父类的方法,导致子类与父类严重耦合
-
设计父类的原则:
- 尽量隐藏父类的内部数据。尽量设置为private,不让子类访问。
- 不要让子类随意访问修改父类的方法。
- 父类当中的辅助方法,要用private,防止子类重写。
- 父类当中的方法需要供外部调用的,又不希望子类修改的,用final修饰
- 父类当中的方法希望子类重写,但不希望被其他类访问,用protected
- 尽量不要在父类的构造器当中调用将要被子类重写的方法
-
何时需要派生新的子类呢?
- 子类需要额外增加属性,不仅仅是属性值的改变
- 子类需要增加自己独特的行为方式
-
组合:把旧类对象作为新类的成员变量组合进来,用以实现新类的方法
- 通常用private修饰旧类对象,因为希望用户看到的是新类的方法
- Person类需要复用Arm类的方法,便可以将arm作为Person的成员变量
- 组合和继承的系统开销没有本质差别
-
-
初始化块
- 普通初始化块,static初始化块(对整个类的类变量进行初始化操作)
- 执行顺序:初始化块-> 构造函数-> 成员变量赋值