方法的重写
(发生在父子之间)
1)方法的重载overload:方法名相同,参数列表不同
方法的重写override:子类通过重写父类的方法,可以用自身的行为替换父类的行为
2)重写的三个条件
1.“==”: 方法名、形参列表相同。
2.“≤”:返回值类型和声明异常类型,子类小于等于父类。
3.“≥”: 访问权限,子类大于等于父类。
3)符号
@Override :主要标识当前的方法是重写父类的方法,该方法必须满足重写的特征
4)重写格式:和父类方法名,形参列表相同
5)作用:方法的重写是实现多态的必要条件。
编写的代码及运行结果
Object类的基本特征
1)Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
eg:public class User2 extends Object{}
2)java.lang.Object常用的方法:toString(),其返回值是 String 类型
如果不重写Object类中的toSting()方法,默认会返回“类名+@+16进制的hashcode”(即返回一个存放的地址名)
编写代码及运行结果
3)如果重写Object类中的toSting()方法会打印出具体的内容
重写Object中的toSting()方法:
public String toString(){
return ....
}
编写代码
==和equals方法
1)==在比较数值类型的值时,代表的是比较的两个数值是否相等
==在比较对象时,代表的是比较两个对象的内存地址是否相同
2)equals如果不重写的话,默认比较的是内存地址
通过子类重写equals方法,比较的是内容是否相同
3)equals方法来源:Object类中的equals方法
Object类中的equals方法的源码如下:(默认比较的是内存地址)
public boolean equals(Object obj);{
return (this == obj);
}
4)重写equals方法
右键 source选项,再点击 Generate hashCode() and equale()...
会出现如下界面,点击右下方的Generate
编写代码及运行结果
super关键字
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
1)super可以直接访问父类的属性和方法
super.属性 super.方法名()
2)使用super关键字访问父类的构造方法,必须放在子类构造方法的第一行
编写代码及运行结果
3)继承树追溯
属性/方法查找顺序:(比如:查找变量h)
1. 查找当前类中有没有属性h
2. 依次上溯每个父类,查看每个父类中是否有h,直到Object
3. 如果没找到,则出现编译错误。
4. 上面步骤,只要找到h变量,则这个过程终止。
构造方法调用顺序:
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。
编写代码及运行结果
封装
1)定义:需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装
2)作用:封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
3)优点:
1. 提高代码的安全性。
2. 提高代码的复用性。
3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。
4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作
注意:我们程序设计要追求“高内聚,低耦合”。 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
没有封装的代码会出现一些问题
4)封装的实现——使用访问控制符
1. private 表示私有,只有自己类能访问
2. default表示没有修饰符修饰,只有同一个包的类能访问
3. protected表示可以被同一个包的类以及其他包中的子类访问
4. public表示可以被该项目的所有包中的所有类访问
编写代码如下
5)使用细节
1.私有的属性(用private修饰的属性)
2.公有的getter方法和setter方法赋值(public修饰的方法)
getter方法取值,命名规则:get+属性名首字母大写+其余字母
注意:boolean类型getter方法:is+属性首字母大写+其余字母
setter方法赋值,命名规则:set+属性名首字母大写+其余字母
3.无参构造方法
JavaBean的封装实例
多态
1)定义:多态指的是同一个方法调用,由于对象不同可能会有不同的行为
生活中的多态:水(固态冰,液态水,水蒸气)
2)优点:提高程序的扩展性和可维护性
3)多态的要点
1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
对象的转型
1)向上转型:父类引用指向子类对象,属于自动转换类型
将子类当作父类进行使用,只能访问子类和父类共有的方法和属性
2)向下转换:将父类类型转换为子类类型,属于强制转换类型
注意: 在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastException。
为了避免出现这种异常,我们可以使用instanceof运算符进行判断
final关键字
1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
2. 修饰方法:该方法不可被子类重写。但是可以被重载!
3. 修饰类: 修饰的类不能被继承。