构造方法,重写重载,Object类

构造方法
语法使用:
修饰符 类名{

构造方法中关于super和this的使用

super
在Java类中使用super来引用父类的成分,super关键字不能使用在静态成分中
① 在构造方法中使用 super(实参);
创建子类对象时,父类的构造方法一定会被调用。并且是父类构造方法先调用。
super(实参); 这句代码必须定义在构造方法中且第1行。
② 调用父类的属性
super.属性名 先找父类属性,若找到了则直接使用,若没有再找父类的父类,以此类推,直到Object类
③ 调用父类的方法super.方法名(实参);
④ super的追溯不仅于直接父类

this
this关键字代表本类对象的引用,this关键字不能使用在静态成分中
在java类中每一个类都存在一个this对象,该this对象表示当前类的一个实例。 可以在类的内部通过this
调用当前的重载的构造方法,属性,方法。
① this在非静态方法中使用
哪个对象调用了该方法,那么this代表调用这个方法的对象
② this什么时候存在的?
当创建了对象时候,this就存在了
③ 当成员变量和局部变量重名时,this区分
this的作用:用来区分同名的成员变量和成员方法。
④ this出现在构造方法中
1> this.属性名=参数名; 代表使用这个构造方法创建的对象
2> this(实参); 必须出现在构造方法中且第1行,代表调用当前类重载构造方法

this和super的区别
相同点: 都不能在static修饰的位置使用
使用super来引用父类的成分
用this来引用当前类的成分

游离块(初识化块)
语法:

//java代码

游离块执行条件
不能直接调用游离块
不管使用哪个构造方法创建对象,游离块先执行(多个游离块,则每个游离块都要执行,按照定义顺序执行一遍),再执行构造方法。
构造方法,重写重载,Object类
重写和重载的区别
重写(override)
在某些情况下,父类中的方法不能够满足子类的需求时,此时子类可以对父类的方法进行覆盖,这个操作为重写。
要求:
①重写是发生在有继承的关系的类中
②三同一不严格(数据类型,方法名,参数要同,修饰符不严格)

重载(overload)
方法的重载:是多态的一种实现策略,方法的重载表现为
存在方法名相同,参数列表不同的方法。(和返回值类型,访问控制修饰符无关)
参数列表: 参数个数不同 或者 参数对应位置数据类型不同
构造方法,重写重载,Object类
注意:
当子类重写父类方法
①观察两个类是否添加了extends关键字标明它们的继承关系
②观察这个父类方法的访问修饰符,是否能够在子类中访问到

==和equals的区别
① ==
情况1:基本数据类型,比较值
情况2:引用数据类型,比较地址 (更准确的讲,判断两个引用是否指向同一个对象)
② equals
情况1: 若没有重写Object类的equals方法,其实本质还是比较地址 Object源码中equals方法的定义:
public boolean equals(Object obj) {
return (this == obj);
}
情况2:
子类重写了Object类的equals方法,一定也要重写hashCode()方法 则按照重写后的规则比较

Obiect
①Object是所有类的父类

声明一个类的时候,没有指定它的父类,则默认继承Object类
public class Animal extends Object{}

②tostring()方法
Object类提供了一个方法 toString(),所有的类都有toString方法
作用:使用字符串表示对象
构造方法,重写重载,Object类
Object obj1=new Object();
String classPath=obj1.getClass().getName();
//java.lang.Object
int hashCode=obj1.hashCode(); //对象的哈希码
String hexValue=Integer.toHexString(hashCode);
//6d06d69c

③getClass()方法
作用: 返回运行时类
构造方法,重写重载,Object类
④equals(Object obj)方法
用于判断两个对象是否相等
构造方法,重写重载,Object类
instanceof
使用规则: boolean 变量名= obj instanceof 类型(和obj有继承关系的类);
含义: 判断 obj 是否属于 指定的类型,
instanceof会判断继承关系,子对象 instanceof 父类 会返回true,父对象 instanceof 子类 会返回 false。
可以理解为判断两个问题:“你是这个类吗?” “你是这个类的派生类吗?”
getClass()判断两个对象的类型
// getClass返回的是一个类名,也就是说只会在类名相同时返回true
// 不会判断子类与父类的继承关系。 System.out.println(obj1.getClass() == obj2.getClass());

引用数据类型转换
①子类转父类(向上转型)
S son =new S();
F father =new F();

②父类转子类(向下转型)
向下转型的对象,必须使用instanceof关键字判断是否可以向下转
F father=new S();
if(father instanceof S){
S son=(S)father;
}

三种区别
S son=new S();

  1. 自己定义的方法
  2. 从父类中继承过来的方法
  3. 存在重写,则调用重写后的方法
    F father=new F();
    1父类中自己的方法
    2 若子类重写了父类方法,则调用重写后的
    构造方法,重写重载,Object类