
继续我们面向对象篇的学习,今天学习的是继承,这部分特别容易迷,多态是重点也是难点部分。概念了解一下即可,关键的会使用它。如果想要快速了解多态的用法,就直接看第五章。第五章是一个综合案例的全套源代码。

如果看着有些困难,不妨去看一下博主的另一篇文章。

java继承

http://t.csdnimg.cn/2ZyyD
多态(Polymorphism)是面向对象编程中一个重要的概念,它允许在不同类的对象上执行相同的操作,但具体执行的操作可能会有所不同。在Java中,多态性通过方法重写(Override)和方法重载(Overload)实现。
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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 void show(){
System.out.println(name+","+age);
}
}public class Administrator extends Person{
@Override
public void show() {
System.out.println("管理员的信息为:"+getName()+getAge());
}
}public class Student extends Person{
@Override
public void show() {
System.out.println("学生的信息为:"+getName()+getAge());
}
}public class Teacher extends Person{
@Override
public void show() {
System.out.println("老师的信息为:"+getName()+getAge());
}
}public class Text {
public static void main(String[] args) {
Student s=new Student();
s.setName("王同学");
s.setAge(18);
Teacher t=new Teacher();
t.setName("王老师");
t.setAge(30);
Administrator a=new Administrator();
a.setName("王管理员");
a.setAge(40);
register(s);
register(t);
register(a);
}
public static void register(Person p){
p.show();
}
}
Text 类是程序的入口,其中包含了 main 方法。Student, Teacher, Administrator 类都是 Person 类的子类,它们分别表示学生、老师和管理员,都继承自 Person 类。Student s = new Student(); 创建了一个 Student 类型的对象 s,并设置了其姓名和年龄。Teacher t = new Teacher(); 创建了一个 Teacher 类型的对象 t,并设置了其姓名和年龄。Administrator a = new Administrator(); 创建了一个 Administrator 类型的对象 a,并设置了其姓名和年龄。register(s);, register(t);, register(a); 分别调用了 register 方法,并传入不同类型的对象作为参数。register 方法的参数类型为 Person,因此可以接受 Student, Teacher, Administrator 类型的对象,这展示了多态的应用。register 方法内部,调用了 Person 类的 show 方法。由于子类 Student, Teacher, Administrator 都重写了 Person 类的 show 方法,因此实际上调用的是各自子类的 show 方法。register 方法中可以使用 Person 类型的参数,而实际传入的可以是其任何子类的对象。在运行时,根据实际对象的类型确定调用哪个子类的方法,这样可以根据需要处理不同类型的对象,而无需改变方法的定义。在Java中,多态性主要通过方法的动态绑定(也称为运行时多态)来实现。这种特性使得在运行时根据对象的实际类型来确定调用的方法,而不是在编译时确定。
instanceof 运算符来判断一个对象的实际类型,这在多态中尤为有用,可以根据需要进行类型检查和转型操作。public class text1 {
public static void main(String[] args) {
Fu f=new adog();
Fu f1=new bdog();
//调用成员变量
System.out.println(f.name);
System.out.println(f1.name);
//调用方法
f.show();
f1.show();
}
}
class Fu{
String name="Fu";
public void show()
{
System.out.println("Fu--show");
}
}
class adog extends Fu{
String name="adog";
@Override
public void show()
{
System.out.println("adog--show");
}
}
class bdog extends Fu{
String name="bdog";
@Override
public void show()
{
System.out.println("bdog--show");
}
}text1 类是程序的入口,包含了 main 方法。在 main 方法中,创建了两个 Fu 类型的引用,分别指向 adog 和 bdog 对象。Fu f = new adog(); 创建了一个 adog 对象,并用 Fu 类型的引用 f 指向它。这是向上转型的示例,父类引用指向子类对象。Fu f1 = new bdog(); 创建了一个 bdog 对象,并用 Fu 类型的引用 f1 指向它。Fu 类中有一个 name 成员变量,初始化为 "Fu"。adog 类和 bdog 类分别有自己的 name 成员变量,但是它们并不会覆盖父类 Fu 的 name 成员变量,而是在各自的类中定义了新的 name 变量。f.show(); 调用的是 adog 类中重写的 show 方法,输出 "adog--show"。f1.show(); 调用的是 bdog 类中重写的 show 方法,输出 "bdog--show"。
以上述代码为例,在子类中添加了一个特有的方法,因为父类中不存在,所以无法调用。

//解决方法,将f强转为adog
if(f instanceof adog a){
a.adogshow();
}else if(f instanceof bdog b){
b.bdogshow();
}else{
System.out.println("没有这个类型,无法转换");
}instanceof关键字
public void bdogshow()
{
System.out.println("bdog--bdogshow");
}为了代码的可读性,又在bdog类中添加了bdogshow方法。
注:不能转换成其他类型,容易报错。

写多态综合练习的时候,要将每一个类进行单独打包,Text测试类中不要有类的定义。


package com.von.day11.text7;
public class Animal {
private int age;
private String color;
public Animal() {
}
public Animal(int age, String color) {
this.age = age;
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//共有方法
public void eat(String something)
{
System.out.println("动物吃"+something);
}
}package com.von.day11.text7;
public class Cat extends Animal{
public Cat() {
}
public Cat(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的猫吃"+something);
}
public void catchMouse() {
System.out.println("猫抓老鼠");
}
}package com.von.day11.text7;
public class Dog extends Animal{
public Dog() {
}
public Dog(int age, String color) {
super(age, color);
}
@Override
public void eat(String something) {
System.out.println(getAge()+"岁的"+getColor()+"颜色的狗抱住"+something+"猛吃");
}
public void lookHome(){
System.out.println("狗看家");
}
}package com.von.day11.text7;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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 void keepPet(Dog dog, String something)
{
System.out.println("年龄为" + this.age + "岁的" + this.name + "养了一只" + dog.getColor() + "颜色的" + dog.getAge() + "岁的狗");
dog.eat(something);
}
//饲养猫
public void keepPet(Cat cat, String something)
{
System.out.println("年龄为" + this.age + "岁的" + this.name + "养了一只" + cat.getColor() + "颜色的" + cat.getAge() + "岁的猫");
cat.eat(something);
}
}