面向对象之三
Posted limengkun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之三相关的知识,希望对你有一定的参考价值。
一、方法覆写(必须在子类的覆写方法头上加上@Override来检测方法覆写是否成功)
1、方法覆写的原因
当父类已存在的方法无法满足子类需求的时候,就覆写父类的此方法。
2、方法覆写的原则
①子类的方法签名必须和父类的一致;
②子类的权限修饰符必须大于或者等于父类的权限修饰符(权限修饰符从小到大为:private<默认不写<protected<public);
③子类的返回值类型必须小于或者等于父类的返回值类型;
3、父类的那些东西可以被子类覆写?
①非私有化的实例行为(实例的行为就是我们所谓的方法);
二、Object类
因为Object类是所有类的老祖宗,所以所有的对象(包括数组)都能调用Object类中的方法。
1、Object类中常用的方法
String toString() 返回调用此方法的当前对象的字符串表示形式(把当前对象转成字符串) ---返回的其实就是当前对象的内存地址
boolean equals(Object obj) 比较两个对象是否相等(比较调用此方法的对象是否和传入的obj”相等”)---因为Object类中的equals方法的底层用的还是==来比较this和obj两个对象,因此比较的还是内存地址
int hashCode() 把当前对象转成一个int值
2、当我们使用toString方法时不想返回地址我们可以怎么做?
覆写Object类的toString方法,实例如下:
public String toString(){
return "name = "+ name+ " age = "+age;
}
3、当我们使用equals方法时不想比较的是内存地址我们应该怎样做?
覆写Object类中的equals方法,实例如下:
public boolean equals(Object obj) {
if(obj instanceof Person){
Person s= (Person)obj;
return (this.name.equals(s.getName()) &&this.age == s.getAge());
}
return false;
}
4、==和equals方法的区别
①==比较基本数据类型时比较的是书面值,比较引用数据类型是比较的是内存地址;
②equals方法不能比较基本数据类型,只能比较引用数据类型,在今后的开发中我们只使用equals方法来进行比较引用数据类型,当我们不想比较内存地址时就覆写Object类中的equals方法。
三、访问权限修饰符
主要控制类以及类中成员的访问权限
1、访问权限修饰符顺序
private < 默认不写 < protected < public 在今后的开发中,一般的规律是所有的类和方法都用public修饰,所有的字段都是用private修饰。
访问范围:private 只能在当前类中访问;
默认不写:只能在当前类、同包中访问
Protected:只能在当前类、同包、不同包但是两者是继承关系的类中进行 访问;
Public:任意地方都能访问
① 外部类 只能够使用public 或者 默认不写;(一般都是public);
② 类中的成员(字段(private),构造方法,方法(public))以及内部类是可以使用任何修饰符修饰的;
③局部变量不能使用权限修饰符修饰。
2、访问方式与访问权限
访问方式(调用方式) 和 访问权限 不是同一个东西;
访问方式:
- 类.方法名/字段 前提 方法名/字段是被static所修饰的
- 对象名.方法名/字段 前提 方法/字段没有被static所修饰
- 直接使用字段/方法 前提 调用方和被调用方要在同一个类中,要么都被 static所修饰,要么都没有被static所修饰
访问权限:
Private 默认不写 protected public
四、Super
1、super指的是父类的对象
2、每一个类中都有一个隐式的无参数构造方法,如果有了显示的,那么隐式的就自动不存在了;每一个构造方法中都有一个隐式无参的super方法,当有了显示的this(...)和super(...)之后,隐式的无参super方法就不存在了。This(...)和super(...)都只是调用构造方法,不会创建对象!
3、this(...)和super(...)调用构造方法的时候不能同时存在,因为必须要位于第一行,普通方法里不能使用this(...)和super(...)调用构造方法
4、this和super调用普通方法和字段的格式时this.move()/字段,super.move()/字段,这个时候两个可以同时存在。
五、System.out.println
System.out.println()和以下是等价的。
Java.io.Printstream p = System.out;
p.println()
以上是关于面向对象之三的主要内容,如果未能解决你的问题,请参考以下文章