Java面向对象之类的继承介绍

目录
  • 继承的作用
    • 如果没有继承机制是怎么样的?
    • 使用继承机制后的示例?
    • 类的继承是什么?
  • 子类和父类的继承机制
    • Java单继承
    • Java继承的顶级父类:Object
  • 对象的类型转换
    • 对象向上转型
    • 对象向下转型
  • 总结

    继承的作用

    如果没有继承机制是怎么样的?

    有以下两个类,分别是Student、Teacher,它们的实现类如下:

    /**
     * 老师类 封装了姓名、年龄
     * 
     * @author Administrator
     *
     */
    public class Teacher {
    	private String name;
    	private int age;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
    
    
    public class Student {
    	private String name;
    	private int age;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
    

    我们发现,这两个类中的属性和方法都是一样的,或者说这两个类都有相同的某些特性。

    使用继承机制后的示例?

    先写一个Person父类:

    public class Person {
    	private String name;
    	private int age;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
    
    

    两个类继承Person

    public class Teacher extends Person {
    
    }
    
    public class Student extends Person {
    
    }
    

    再写个测试类看一下:

    public class Test {
    	public static void main(String[] args) {
    		Student s = new Student();
    		s.setName("学生");
    		Teacher t = new Teacher();
    		t.setName("老师");
    		System.out.println(s.getName() + " " + t.getName());
    	}
    }
    
    

    类的继承是什么?

    通过上面的演示,我们发现继承了Person类后,就算在Student、Teacher类中不写对应的方法,也能使用父类的方法,这说明了子类继承了父类的属性和方法。其中Person叫做父类,Student、Teacher这样的由Person衍生的类叫做子类。继承的关键字是extends

    继承的作用:减少重复的、冗余的相同属性和方法。

    多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些相同的属性和行为,只有继承那个类即可。

    子类和父类的继承机制

    继承关系是两个类,一个为子类(派生类),一个是(父类)。子类继承父类,使用关键字extends表示(extends的意思是扩展,所以子类是对父类的扩展,就是说,我们还可以在子类中添加独属于它的属性和方法)。Java中的类只有单继承,没有多继承(一个儿子只能有一个爸爸,但是爸爸可以有多个儿子)

    Java单继承

    Java不支持多继承,只允许一个类直接继承另一个类;
    子类只能有一个父类,extends 关键字后面只能有一个类名

    public class Animal {
    
    }
    
    public class Person {
    
    }
    

    我们让Student继承Animal和Person:

    发现不允许多继承。这里提一下,虽然不能多继承,但是可以实现多个接口。

    虽然不能多继承,但不代表不能多重继承(爸爸的爸爸是爷爷):

    public class Person extends Animal{
    
    }
    
    public class Student extends Person {
    
    }
    

    学生是人类,人类是动物,所以学生也是动物。

    Java继承的顶级父类:Object

    Object类是Java中所有类的始祖,Java中的每一个类都是由它扩展而来,但是并不明确写出要继承它,根据继承的特性,所有的Java类都拥有其方法

    这里介绍Object中的常用方法:hashCode()toString()equals(Object obj),这也是所有类都有的方法。

    hashCode()方法: 返回对象存储地址。

    	public static void main(String[] args) {
    		System.out.println(new Person().hashCode());
    		System.out.println(new Person().hashCode());
    	}
    

    这个地址对于每个对象都是唯一的,如果两对象的hashCode值一样,说明它们是同一对象。

    toString()方法:该方法用来返回对象的字符串表示形式。

    	public static void main(String[] args) {
    		System.out.println(new Person().toString());
    		System.out.println(new Person().toString());
    	}
    

    默认的toString()方法是类名+@+hashCode()相关的唯一标识。

    看源码如下:

    现在我们重写一下toString()方法:

    public class Person {
    	private String name;
    	private int age;
    
    	public Person() {
    		this.name = "未命名";
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + "]";
    	}
    }
    

    运行结果:

    equals(Object obj): 该方法用于判断两个对象是否相同,如果没有被重写,其与==等价。

    	public static void main(String[] args) {
    		Person p1 = new Person();
    		Person p2 = new Person();
    		System.out.println(p1.equals(p2));
    	}
    

    equals方法源码如下:

    Object的equals方法比较的就是两对象的地址。
    String类的equals方法就被重写了。

    对象的类型转换

    对象向上转型

    子类转换成为父类,向上转型
    格式: 父类名称 对象名称 = new 子类名称();
    含义: 把创建的子类对象当做父类看待和使用

    public class Person {
    	public void run() {
    		System.out.println("Person run");
    	}
    }
    
    public class Student extends Person{
    	public void study() {
    		System.out.println("Student study");
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		// 子类的对象 当作 父类的类型 使用,向上转型
    		Person stu = new Student();
    		stu.run();
    		// 父类不能调用子类特有的方法
    //		stu.study();
    
    	}
    }
    

    对象向下转型

    父类转换为子类,向下转型
    子类 引用 = (子类) 父类对象
    强制类型转换

    	public static void main(String[] args) {
    		Person p = new Person();// 向下转型
    		Student stu = (Student) p;
    
    		Student stu1 = (Student) new Person();// 还可以这样写
    
    		stu.run();
    		stu.study();
    	}
    

    需要注意可能会报java.lang.ClassCastException异常;
    当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。

    以下情况就不会报类型转换的异常,因为原本就是Student类的,强转回来依旧是Student类

    	public static void main(String[] args) {
    		Person p = new Student();
    		Student stu = (Student) p;
    		stu.run();
    		stu.study();
    	}
    

    明显地,类的类型转换就跟基本数据类型的转换写法一致。

    总结

    本文转自网络,如有侵权请联系客服删除。