一、继承(Inheritance)
1. 概述
继承是面向对象编程的一种特性,允许我们定义一个类(称为子类或派生类)以继承另一个类(称为超类或基类)的功能。
2. 语法格式
public class Zi extends Fu {// 子类新增的属性和方法
}
3. 继承的优点
- 代码复用:子类自动拥有父类的非私有成员变量和方法。
- 层次结构清晰:有助于构建和维护大型项目。
4. 访问权限修饰符
Java中有四种访问权限修饰符:
private
:仅在本类内可见。default
(即不写任何修饰符):在同一包内可见。protected
:在同一包内及子类中可见。public
:在任何地方都可见。
这些修饰符决定了成员变量的访问范围,从严格到宽松依次为:private < default < protected < public
。
5. 继承的特点
- 单一继承:每个子类只能有一个父类。
- 多层继承:可以通过多个层次进行继承。
- 所有类默认继承自
Object
类。
6. 方法重写(Overriding)
当子类需要提供不同于父类的实现时,可以使用@Override
注解来重写父类的方法。
二、多态(Polymorphism)
1. 概述
多态是指在程序中同一个行为具有多种表现形式。它是面向对象程序设计的重要内容之一。
2. 多态的表现形式
主要有两种形式:
- 方法的多态:通过重载(overloading)和重写(override)来实现。
- 对象的多态:通过向上转型(upcasting)和向下转型(downcasting)来实现。
3. 向上转型
将子类的引用赋值给父类的引用,例如:
Person p = new Student();
此时只能调用Person
类中的方法,不能调用Student
特有的方法。
4. 向下转型
在某些情况下,我们需要访问子类特有的方法和属性,这时需要进行强制类型转换,即向下转型:
if (p instanceof Student) {Student s = (Student)p; // 强制转换为Student类型s.study(); // 调用Student类特有的study方法
} else {System.out.println("p is not a Student");
}
需要注意的是,在进行向下转型之前必须确保对象确实是目标类型的实例,否则会抛出ClassCastException
异常。
5. instanceof操作符
用于判断一个对象是否属于某个特定类型或其子类型:
boolean result = p instanceof Student;
返回值为true
表示p
是Student
类型的实例,否则为false
。
三、示例代码解析
下面是一段演示继承和多态特性的简单Java程序:
public class Demo153 {public static void main(String[] args) {// 创建一个Student对象并向上转型为Person类型Person p = new Student();// 尝试调用Student特有的study方法,但由于p被声明为Person类型,// 所以编译时会报错,因为Person类中没有定义study方法。// 为了解决这个问题,我们可以使用instanceof操作符来判断p是否实际上是Student类型,// 然后再进行强制类型转换。if (p instanceof Student) {((Student)p).study(); // 正确地调用了Student类的study方法} else {System.out.println("p is not a Student");}}
}class Person {public void run() {System.out.println("Person running...");}
}class Student extends Person {@Overridepublic void study() {System.out.println("Student studying...");}
}
在这个例子中,我们首先创建了一个Student
对象s
,并将其向上转型为一个Person
类型的引用p
。当我们试图直接通过p
调用study()
方法时,由于p
的类型是Person
而不是Student
,所以编译器会报错。为了解决这个问题,我们使用了instanceof
操作符来检查p
是否实际上是一个Student
对象,如果是的话,我们就将其强制转换为Student
类型,然后就可以正常调用study()
方法了。