继承、抽象

继承(is-a关系)
一、使用继承的流程
1.编写父类
[访问修饰符] class Pet{
//公共的属性和方法
}
2.编写子类,继承父类(extends 继承关键字)
[访问修饰符] class Dog extends Pet{
//子类特有的属性和方法
}
3、何时使用继承:
符合is-a关系的设计使用继承
将子类共有的属性和行为方到父类中
4、继承是java中实现代码重用的重要手段之一。
java中只支持单根继承,即一个类只能有一个直接父类
5、子类可以继承父类的情况
a、被public和protected修饰的属性和方法,不管子类和父类是不是在一个包里
b、继承被默认修饰符修饰的属性和方法,但子类和父类必须在同一个包里
6、不能被继承的父类成员:
a、private成员
b、子类与父类不在同包,使用默认修饰符访问权限的成员
c、构造方法不能继承,但是能调用
二、方法重载
1.一个类里面可以有多个同名的但参数不一样的方法,叫方法重载
2.方法重载(overload)
3.方法重载满足的条件:1.同一个类中2.方法名相同3.参数不同(个数、顺序、类型)
4.注意:方法的返回值类型与方法重载无关
方法的返回值有时会不接收,这样系统就无法判断需要调用哪一个方法
(1)通过this()关键字调用其它构造函数
(2)代码必须放在整个构造函数的第一行

三、课工场:
3、继承条件下的构造方法
a、子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法,系统默认调用父类的无参构造方法
b、子类构造方法通过super显式调用父类的有参构造方法,系统执行父类相应的构造方法,而不执行父类的无参构造方法
c、子类构造方法通过this显式调用自身的其他构造方法时,直接用this(参数1,参数2,、、)进行调用,接着用this.参数=参数来接剩下需要用的参数
如:public Dog(String name,int age,int health,String sex){
this(name,age,health);
this.sex=sex;
}
码农平台:
3、继承关系下的构造函数(有参调父类的有参,无参调父类的无参)
a、如果一个类没有显示声明构造函数,则系统会为其分配一个默认的无参的构造函数
b、构造函数只能通过new关键字调用,构建对象的时候,会调用构造函数
***** c、子类在构建对象的时候,会先调用父类的构造函数,再调用子类的构造函数
d、默认情况下,子类如果不显示调用父类的构造函数,则会调用父类的无参的构造函数
e、子类如果需要显示调用父类的构造函数,则需要使用super关键字,且放在构造函数第一行
f、父类如果没有无参的构造函数,则子类必须显示调用父类的构造函数(写入子类的有参构造函数),因为需要传参
4、单根继承
1.java只支持单根继承
2.一个类只能有一个直接父类
3.一个类可以有多个间接父类
5、this和super的区别
区别 this super
访问属性 访问本类属性,如果没有则从父类找 访问父类中的属性
访问方法 访问本类方法,如果没有则从父类找 访问父类中的方法
访问构造 调用本类构造,放在构造方法首行 调用父类构造,放在子类构造方法首行

区别 this super
访问属性 访问本类属性,如果没有则从父类找 访问父类中的属性
访问方法 访问本类方法,如果没有则从父类找 访问父类中的方法
访问构造 调用本类构造方法,放在构造方法首行 调用父类构造,放在子类构造方法首行

四、方法重写(overrindes重写)
1.子类访问父类成员
(1)访问父类构造方法
super();
super(name);
(2)访问父类属性
super.name;
(3)访问父类方法
super.print();
2、使用规则:
使用super关键字,super代表父类对象
a、super只能出现在子类的方法和构造方法中
b、在子类构造方法中调用必须是第一句
c、不可以访问父类中定义为private的属性和方法
2、方法重写规则(课工场)
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
6.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)(直接照着父类的方法写就行)
7.父类的私有方法不能被子类覆盖
8.不能抛出比父类方法更多的异常
2、方法重写的条件(码农平台)
1、子类继承父类
2、方法签名相同(返回值类型、方法名、参数)
3、不能缩小被重写方法的访问权限
3、方法重写与方法重载
比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同类 相同 不相同 无关 无关
比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同类 相同 不相同 无关 无关

绑定机制:静态绑定 动态绑定
实例方法在调用的时候,遵循的是动态绑定机制 ,与引用变量实际引用的对象绑定,调用重写后的方法,由运行时的jvm(java虚拟机)决定
静态方法(静态绑定机制) 与引用变量所声明的类型绑定。实际上在编译阶段就做了绑定
成员变量(包括静态变量和实例变量,静态绑定机制)与引用变量所声明的类型绑定。实际上在编译阶段就做了绑定。
4、final关键字
(1)修饰基本数据类型变量,表示为常量,值不能变
(2)修饰引用变量,表示该变量的引用不能变,但所指向的对象的属性值可以修改
(3)修饰类,说明是一个终态类,不能被继承,即不能有子类
(4)修饰方法,说明该方法是一个终态方法,不能被子类重写

五、Object类
1、任何类都直接或间接继承自Object类
2、在一个类中,如果没有显示通过extends关键字继承某个父类,则默认继承自object类
3、Object经常被子类重写的方法
方法 说明
toString() 返回当前对象本身的有关信息,按字符串对象返回
equals() 比较两个对象是否是同一个对象,是则返回true
hashCode() 返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象

方法 说明
toString() 返回当前对象本身的有关信息,按字符串对象返回
equals() 比较两个对象是否是同一个对象,是则返回true
hashCode() 返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象
4、其中toString()方法经常被重写:
toString()方法:
public String toString(){
return getClass().getName()+”@”+Integer.toHexString(hashCode());
}
重写toString()
第一种搞怪的写法:
Public String toString(){
Return “搞怪吧!”;
}
第二种写法:
public String toString() {
return this.name;//让其返回name属性
}
5、Object类的equals()方法就是通过重写object类来实现字符串内容的比较的
注意:instanceof用于判断引入的参数(对象)的类型和需要的类型是否一致
1.比较两个对象是否是同一对象,是则返回true
2.操作符==
i、基本数据类型比较只能使用== 如12
ii、引用类型,比较两者是否为同一对象
注意:
(1)Object 类的equals()方法与
没区别
(2)当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()
(3)Java.lang.String重写了equals()方法,把equals()方法的判断变成了判断其值
String 的equlas和的用法:
equlas比较的是值是否相同
比较的是内存地址是否相同
面试题:怎么重写string()?
思路:先判断判断是不是同一个对象,如果是return true;如果不是则没得比
再判断是不是String类型,,然后再判断长度,然后一个一个字节比
Public boolean equals(Object anObject){
If(this
anObject){
Return true;
}
If(anObjet instanceof String){
String anotherString=(String)anObject;
int n = value.length;
if(n
anotherString.value.length){
char v1[] = value;
Char v1[] = anotherString.value;
int i=0;
While(n-- !=0){
if(v1[i] !=v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

重写equals():
public boolean equals(Object obj) {
if(thisobj){//拿obj和当前对象比较,是则返回true
return true;
}
if(!(obj instanceof Teachers)){//拿instanceof来判断obj是否是Teachers类的
return false;
}
Teachers s=(Teachers)obj;//如果obj是Teachers对象,则把obj转换为Teachers 对象s
if(this.age
s.age && this.name.equals(s.name)){//如果this的age和s的age相等,则true
return true;
}else{//否则false
return false;
}
}

六、抽象类和抽象方法
1、过于顶层的类,它的某些方法过于抽象,无法实现,或者即使实现也无意义
2、这时候就可以考虑把过于抽象的方法设置为抽象方法
3、abstract关键字表示抽象
4、抽象方法没有方法体,即没有具体实现
5、抽象方法必须在抽象类中,抽象类也用abstract修饰
6、抽象类可以有抽象方法,也可以没有抽象方法,也可以包含实例方法(普通方法)
7、有抽象方法的类一定是抽象类,但抽象类不一定有抽象方法
8、抽象类是抽象的,不能实例化,因为它里面可能包含抽象方法,所以不允许你实例化调用它的方法
9、子类继承抽象类,必须重写父类的所有抽象方法,除非子类也是抽象类
10、注意:
(1)抽象方法不能有具体实现,即不能有方法体
(2)抽象方法要用分号结束
(3)abstract可以用来修饰类和方法,但不能修饰属性和构造函数
(4)private方法不能设置为abstract,因为私有方法不能被子类访问,无法重写
(5)Static方法不能和abstract联用,因为static方法必须有方法体
(6)abstract方法不能和final联用,互相矛盾(final规定不能重写,abstract要求必须重写,互相矛盾)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值