继承和多态
继承
继承是面向对象大的三大特性之一。
在Java中只支持单继承,即每个类只能有一个直接父类。
-语法
[访问修饰符]class<SubClass>extends<SuperClass>{
}
在Java中继承通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类或基类
访问修饰符如果是public,那么该类在整个项目中可见
若不写访问修饰符,则该类只在当前包中可见
在Java中,子类可以从父类中继承以下内容:
1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里;
2.可以继承默认修饰符修饰的属性的方法,但是子类和父类必须在同一个包里;
3.无法继承父类的构造方法
//父类为Department
public class Department{
private int ID;//部门编号
private String name="";//部门名称
private int amount=0;//部门人数
private String reponsibility="";//部门职责
private String manager="";//部门经理
public Department(){
//无参构造方法
}
public Department(String name,String manager,String responsibility){
//带参构造方法
this.name=name;
this.manager=manager;
this.responssibility=responsibility;
}
public int getID(){
return ID;
}
public void setID(){
this.ID=id;
}
//...省略的其他aetter\getter的代码
public void printDetail(){
System.out.println("部门:"+this.name+"\n经理:"+this.manager
+"\n部门职责:"+this.responsibility+"\n+.....");
}
}
方法重写
方法重写或方法覆盖(overriding)
1.子类根据需求对父类继承的方法进行重新编写
2.重写时,可以用 super.方法 的方式来保留父类的方法
3.构造方法不能被重写
方法重写规则
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
6.子类可以定义为父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
7.父类的私有方法不能被子类覆盖
8.不能抛出比父类方法更多的异常
Object类
Object类是所有类的父类
Object类被子类经常重写的方法
方法 | 说明 |
---|---|
toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
equals() | 比较两个对象是否是同一个对象,是则返回true |
hashCode() | 返回该对象的哈希代码值 |
fetClass() | 获取当前对象所属的类信息,返回Class对象 |
Object类的equals()方法
1.比较两个对象是否是同一个对象,是则返回true
2.操作符 ==
-1.简单数据类型,直接比较直。如 1==2
-2.引用类型,比较两者是否为同一对象
–1.Object类的equals()方法与==没区别
–2.当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()
–3. Jaca.lang.String 重写了equals()方法,把equals()方法的判断变为了判断其值
多态
使用父类作为方法的形参,是Java中实现和使用多态的主要方法
什么是多态
1.同一种事物,由于条件不同,产生的结果也不同
多态:同一个引用类型,使用不同的实例而执行不同操作
多态的使用
1.方法重写时实现多态的基础
抽象方法
1.抽象方法没有方法体
2.抽象方法必须在抽象里
3.抽象方法必须在子类中被实现,除非子类时抽象类
public abstract void print();
向上转型
<父亲类><引用变量类型>=new<子类型>();
1.通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
2.通过父类引用变量无法调用子类特有的方法
向上转型:父类的引用指向子类对象,自动进行类型转换
向下转型
调用子类特有的方法
Dog dog = (Dog)pet;//将pet转换为Dog类型
dog.catchingFlyDisc;//执行Dog特有的方法
向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换
<子类型><引用变量名>=(<子类型>)<父亲类型 的引用变量>;
在向下转型的过程中,如果没有转换为真是子类类型,会出现类型转换异常
instanceof
1.如何减少在向下转型的过程中,没有转换为真实子类类型的类型转换异常?
Java中提供了 instanceof 运算符来进行类型的判断
2.使用 instanceof 时,对象的类型必须和 instanceof 后面的参数所指定的类在继承上有上下级关系
案例
案例1
创建子类 狗狗类
//狗狗类
public class Dog extends Pet {
private String strain;
public Dog(String name,int health,int love,int strain) {
super(name,health,love);
this.strain = strain == 1 ? "泰迪" : "雪娜瑞犬" ;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
@Override
public void print() {
super.print();
System.out.println("我是一只"+this.strain);
}
}
创建子类 企鹅类
//企鹅类
public class Penguin extends Pet {
private String sex;
public Penguin(String name,int health,int love,int sex) {
super(name,health,love);
this.sex = sex == 1 ? "Q仔" : "Q妹";
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public void print() {
super.print();
System.out.println("我的性别是"+this.sex);
}
}
创建父类 宠物类
import java.util.Scanner;
//宠物电子系统
public class Pet {
private String name;
private int health;
private int love;
public Pet() {
super();
}
public Pet(String name,int health,int love) {
this.name = name;
this.health=health;
this.love= love;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的自白: ");
System.out.println("我的名字叫 "+this.name+",我的健康值是"+this.health+",我和主人的亲密度是"+this.love+".");
}
}
创建测试类 Test
import java.util.Scanner;
public class TestHw01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("欢迎来到宠物店");
// System.out.println("Please enter the name of Pet");
// String name = sc.next();
System.out.print("请选择宠物的类型(1.狗狗 2.企鹅):");
int type = sc.nextInt();
switch(type) {
//Type of Dog
case 1:
Dog d = new Dog("欧欧",100,0,2);
d.print();
break;
//Type of Penguin
case 2:
Penguin p = new Penguin("楠楠",100,0,2);
p.print();
break;
}
}
}