继承
面向对象特点:继承、封装、多态、抽象
对象与对象(类)之间存在哪些关系
1.关联关系:最弱的一种关系(学生类中的老师)
2.继承关系:比较强的一种关系,能够用什么是什么来描述并符合逻辑的就是继承关系
3.聚合关系:比较强的一种关系,聚集和组合,能够用什么是什么的一部分来描述
4.实现关系:子类要去实现父接口
格式:
class 父类 {
}
class 子类 extends 父类 {
}
java中继承的特性
1.子类继承父类,子类可以拥有父类的所有非私有属性和非私有方法。访问修饰符范围,private只能用于本类,public所有类都可以用
2.子类可以拥有自己的属性和方法,对父类进行扩展
3.子类也可以实现父类的方法
4.java的继承是单继承、一个类只能有一个父类,一个类可以多重继承
缺点:
提高了类与类之间的耦合性,代码之间的联系非常机密,代码的独立性差,以后的替换和修改不容易
构造器
特点:没有返回值,方法名和类名一样,也称为构造函数
作用:
1.只要创建对象采用的new关键字,首先执行的就是构造器,构造器创建对象。如果没写构造器,编译器会自动给每个类创建无参构造器
2.初始化属性,使用对象的时候可以直接获取到初始化的值
# 如果写了有参构造,编译器不会自动添加无参构造,要手动添加无参构造器 #
public T01_Rabbit(int id,String name,String color){
//初始化属性
this.id = id;
this.name = name;
this.color = color;
}//先在类中创建有参数的构造函数,使用时要传参,不然没有值
使用有参数的构造函数创建对象:直接new构造函数,并将具体的参数传入
T01_Rabbit rabbit3 = new T01_Rabbit(2,"小白兔","灰色");
# 创建对象时,先创建父类,在创建子类 #
object对象
object类是所有类的根类,如果没有extends去继承类,默认继承object类
创建的任何一个对象都可以使用object提供的方法,object提供了所有类公用的各种方法
Object类重要的方法:
toString():alt+shift+s gener toString 父类的toString方法就将内存地址转化为类名+hashcode码,重写toString 优先调用子类的toString
java默认规定,如果你输出的对象的变量,默认调用toString,将内存地址转化为字符串输出
java输出内容的时候 输出变量.属性 变量.行为 默认不会执行toString
作用:调用重写的toString方法输出对象的全部内容
@Override
public String toString() {
return "ATM [userName=" + userName + ", password=" + password
+ ", money=" + money + ", index=" + index + "]";
}
equals() ==比较的是内存地址 对象的equals也比较的内存地址,不过equals能够被重写, String中的equals经过重写
hashcode equals和hashcode方法都是java来设计判断两个对象是否相等的方法,但equals在比较的时候,是比较的对象的所有属性是否相等,只有属性全部相等,两个对象才相等,效率比较低
hashcode方法用hash值进行比较(hash算法),效率非常高
区别:
hashcode不完全可靠,有时候不同对象生成的hashcode一样
特点:
1.equals相等的两个对象对应的hashcode值一定相等,equals进行判断是可靠的
2.hashcode相等的对象,使用equals进行比较并不一定相等,所以hashcode不完全可靠(hash冲突)
注意:String new的对象equals不等,hashcode的值也不同,内存地址不同。
# hashcode和equals的配合使用:
对于大量和快速的对比,如果全部使用equals效率比较低;
解决方案:联合使用hashcode和equals,先用hashcode看值是否相等,如果值不等,没必要继续比较,如果相等,调用equals再进比较
public boolean equals(Object obj) {
Cat c=null;
if(obj!=null){
c = (Cat) obj;
if(this.hashCode()==c.hashCode()){
if(this==obj){
return true;
}
//先将Obj对象转化为 Cat对象
//判断两个对象所有的属性相等 那才表示两个对象是相同的
if(this.id==c.id && this.name==c.name){
return true;
}
}else{
return false;
}
}
return false;
}
值传递
值传递:将值传递给方法然后计算,不影响之前的值,传递的值的一个副本
引用传递:传递对象本身
在java中只有值传递(当传递对象时,传递的是地址,而不是对象本身)
super
java中有几种表现形式:
1、super.属性 super.方法() 用来调用父类的方法和属性
2、super(参数)
在java类中,使用super关键字来表示引用父类的属性和方法,或者调用父类的构造器,this代表当前对象,super表示父类对象
执行的顺序:
1.子类对象 先执行 子类的无参构造,在执行无参构造的时候发现当前类有父类的属性和方法:super.属性 super.方法()优先使用
2.默认调用父类的无参构造,super(参数) 表示自己指定要调用父类那个有参构造
3.回到子类继续执行子类构造
final
final修饰变量,变量的值不能修改,变量变成常量
final可以修饰类,表示当前类是最终类,当前类不能再做修改或者扩展,不能被任何子类继承
final修饰方法,表示该方法不等被重写