尧图精选

大白话!Java中的继承和多态的理解

🕒 发布时间:2026/10/2 2:21:58 📁 来源:尧图网络
目录什么是继承什么是父类什么是子类继承有什么好处Java中的代码演示构造方法在类继承中的作用构造方法在继承关系中的使用什么是多态方法的重载重载代码演示方法的覆盖覆盖代码演示向上转型和向下转型向上转型向上转型的代码演示向上转型的优缺点向下转型向下转型的代码演示多态的优点什么是继承继承是面向对象编程中两个类之间的一种关系。被继承的类称为父类或超类而继承父类的类则称为子类。什么是父类什么是子类父类实际上使所有子类公共域和公共方法的集合而每个子类则是父类的特殊化使对公共域和方法在功能、内涵方面的扩展和衍生。继承有什么好处继承可以使代码结构更加清晰降低编码和维护的成本。Java中的代码演示定义类的时候通过关键字extends指明要继承的直接父类。子类对象除了可以访问子类中直接定义的成员外也可以访问父类的所有非私有成员。class Animal { public String name; public int age; public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public void bark(){ System.out.println(name正在汪汪汪叫); } } public class Test { public static void main(String[] args) { Dog d new Dog(); d.eat(); //Dog类中并没有eat方法eat方法是从Animal中继承而来的 d.bark(); System.out.println(d.name); } }构造方法在类继承中的作用首先构造方法不能被继承因为子类对象要对继承的父类的成员进行初始化所以在创建子类对象时除了执行子类自己的构造方法还需要执行父类的构造方法。子类可以在自己构造方法使用关键字super来调用父类的构造方法但是super调用的语句必须时子类构造方法第一条可执行语句如果在子类定义构造方法中没有使用super来明确调用父类的构造方法则在创建对象时首先自动执行父类的无参构造方法然后再执行自己定义的构造函数会报错的情况class Animal1{ public String name; //有一个参数的构造方法 public Animal1(String name){ this.namename; } } class Cat extends Animal1{ //因为在子类的对象中没有使用super调用父类的有参构造方法所以会报错 }不会报错的情况class Animal1{ public String name; //有一个参数的构造方法 public Animal1(String name){ this.namename; } } class Cat extends Animal1{ public Cat(String name) { super(name); //利用super 调用父类一个参数的构造方法 } }构造方法在继承关系中的使用import java.awt.*; class Point { int x; int y; //有参构造方法 Point(int x,int y){ this.xx; this.yy; } //无参构造方法 复习前一节知识点可以用this Point(){ this(0,0);//可以利用this调用上面一种构造方法 } Override public String toString() { return Point{ x x , y y }; } } class Pixel extends Point { //子类中自己的成员变量 Color c; Pixel(int x,int y,Color c){ super(x,y); //一定要把super写在子类自己构造方法的内部 this.cc; } Override public String toString() { return super.toString() 颜色 c; } } public class Test3 { public static void main(String[] args) { Pixel pnew Pixel(3,24,Color.blue); System.out.println(p); } }输出结果Point{x3, y24} 颜色 java.awt.Color[r0,g0,b255]【说明】上面的代码中使用了俩次出现super的情况一种是在构造方法中另外一种在toString方法中super可以表示当前对象的直接父类对象引用通过super还以引用访问父类的属性和方法。什么是toStringhttps://baike.baidu.com/item/toString/9871895https://baike.baidu.com/item/toString/9871895【注意】使用this查找时首先在本类查找在找不到时再到父类和祖先类中去寻找使用super查找匹配方法时首先到直接父类去寻找如果在直接父类中找不到则继续到其祖先类逐级往高层查找。什么是祖先类Java中的祖先类是 ‌Object类‌。它是所有类的根无论是否显式继承最终都会追溯到它什么是多态多态性主要体现在以下两个方面。方法的重载overload。也称参数多态是指在同一个类中定义多个方法名相同但是参数形态有所不同的方法【参数的个数不同参数的位置不同参数的类型不同】。一个类中可以有多个构造方法也叫做构造方法的多态性。子类对父类方法的覆盖override。是因为继承带来的多态子类中对父类的定义的方法重新定义这样在子类中将覆盖来自父类的同形态方法。方法名、形参列表必须和父类保持一致实现子类自己的逻辑方法的重载方法的重载就是在同一个类中存在多个方法名相同但是参数不同的方法。方法调用的匹配处理的原则首先就是按照“精确分配”原则去查找匹配方法如果找不到则按“自动类型转换匹配”原则去查找能匹配的方法。所谓“精确匹配”就是实参和形参类型完全一致。所谓“自动类型转换匹配”是指虽然实参和形参不同但是能将实参的数据按照自动原则赋值给形参。重载代码演示class A{ void test(int x){ System.out.println(test(int):x); } void test(long x){ System.out.println(test(long):x); } void test(double x){ System.out.println(test(double):x); } } public class Test4 { public static void main(String[] args) { A a1new A(); a1.test(5); a1.test(10.0); } }输出结果显示【说明】因为实参5默认是int型的数据因此有test(int x)方法存在时按照“精确匹配”原则处理但如果无该方法存在将按“转换匹配”原则处理原则优先考虑匹配test(long x)方法。【思考】如果将test(long x)和test (int)方法都注释掉那么情况会怎么样答会输出test(double)5.0和test (double) 10.0方法的覆盖子类将继承父类的非私有方法在子类中也可以对父类定义的方法重新定义。这时将产生方法的覆盖。也就是通过子类对象访问的方法就是子类自己重新定义的方法。【注意】子类在重新定义父类己有的方法时应保持与父类完全相同的方法头部声明也就是说应该要与父类具有完全相同的方法名参数列表返回类型一般也要相同。class B extends A{ //将覆盖父类的方法 void test(int x){ System.out.println(B:test(int):x); } //不会覆盖父类的方法 void test(int x,String y){ System.out.println(B:test(int,String):x,y); } }【注意】方法名、参数列表完全相同时才会产生方法的覆盖。返回值类型通常也要一致。方法的覆盖不能改变方法的静态与非静态属性。子类中不能将父类的实例方法定义为静态方法也不允许将父类的静态方法定义为实例方法。不允许子类中方法的访问修饰符比父类的有更多的限制。覆盖代码演示class animal{ private int age; private String name; //生成构造函数 public animal(int age, String name) { this.age age; this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public String getName() { return name; } public void setName(String name) { this.name name; } public void eat(){ System.out.println(this.getName()正在吃东西); } } class dog extends animal{ public dog(int age, String name) { super(age, name); } Override //对父类animal中的eat方法进行覆盖 public void eat() { System.out.println(this.getName()正在吃狗粮); } } class cat extends animal{ public cat(int age, String name) { super(age, name); } Override public void eat() { System.out.println(this.getName()正在吃猫粮); } }向上转型和向下转型向上转型向上转型实际上就是创建一个子类对象将其当成父类的对象来使用语法格式父类类型 对象名 new 子类类型()向上转型有三种方法直接赋值的向上转型方法传参的向上转型返回值向上转型向上转型的代码演示//父类 动物 class Animal { public String name; public int age; public Animal(String name, int age) { this.name name; this.age age; } public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public Dog(String name, int age) { super(name, age); } public void bark(){ System.out.println(name正在汪汪汪叫); } public void eat(){ System.out.println(this.name正在吃狗粮); } } public class Test { public static void feed(Animal animal){ animal.eat(); } public static Animal getAnimal(){ return new Dog(旺财, 1); } public static void main(String[] args) { //1.直接赋值的向上转型 Animal animal new Dog(旺财, 1); animal.eat(); //2.方法传参的向上转型 Dog dognew Dog(旺财, 1); feed(dog); //3.返回值向上转型 Animal agetAnimal(); a.eat(); } }输出三个旺财正在吃狗粮向上转型的优缺点向上转型的优点让代码实现更简单灵活。向上转型的缺陷不能调⽤到⼦类特有的⽅法。因为编译器之人父类中声明过的方法子类独有的方法父类中没有定义编译器直接报错。向下转型向下转型将父类引用再还原为子类对象。【注意】向下转型⽤的⽐较少⽽且不安全万⼀转换失败运⾏时就会抛异常。Java中为了提⾼向下转型的 安全性引⼊了 instanceof如果该表达式为true则可以安全转换。向下转型的代码演示class Animal { public String name; public int age; public Animal(String name, int age) { this.name name; this.age age; } public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public Dog(String name, int age) { super(name, age); } public void bark(){ System.out.println(name正在汪汪汪叫); } public void eat(){ System.out.println(this.name正在吃狗粮); } } public class Test { public static void main(String[] args) { Animal anew Dog(旺财,1); if(a instanceof Dog){ //如果a时Dog才会强转 Dog d(Dog)a; d.bark(); } else{ System.out.println(不是Dog类型不能被强转); } }什么是Java在的instanceof多态的优点优点能够降低代码的 圈复杂度, 避免使⽤⼤量的 if - else可扩展能⼒更强
上一篇/下一篇内容由系统自动关联 返回资讯列表 →