专栏推荐:Java入门知识
内容推荐:“继承与组合:代码复用的两种策略“
今日诗词:马踏祁连山河动,兵起玄黄奈何天
快去学习
多态:不同对象执行同一方法产生出不同结果。
比如:狗狗吃饭和猫咪吃饭,同样吃饭,狗狗吃狗粮,猫咪吃猫粮,这也是多态
三要素: 1.继承
2.子类必须要对父类方法进行重写
3.通过父类的引用调用重写的方法
这三者同时具备形成了多态
package Test1;
class Animal {
String name;
int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() { //父类的方法
System.out.println(age + "岁的" + name + "正在吃-----");
}
}
class Dog extends Animal {
public Dog(String name, int age) {
super(name,age);
}
@Override //这表明父类方法被重写了
public void eat() { //子类重写父类方法
System.out.println(age + "岁的" + name + "正在吃狗粮");
}
}
class Cat extends Animal {
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() { //子类重写父类方法
System.out.println(age + "岁的" + name + "正在吃猫粮");
}
}
public class Test1 {
public static void eat(Animal animal) { //Animal animal就是父类的引用
animal.eat();
}
public static void main(String[] args) {
Dog dog = new Dog("狗狗", 3);
Cat cat = new Cat("猫猫", 4);
eat(dog); ///通过父类的引用调用对应的eat方法
eat(cat);
}
}
运行结果
重写:方法名不变、参数不变、返回类型不变、内容随意(除了内容,其他和父类保持一致
重载:方法名不变、参数必须改变、返回类型可以改变、内容随意
可以参考下图
实际就是创建一个子类对象
语法:父类类型 对象名 = new 子类类型
package Test1;
class Animal {
String name;
int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() { //父类的方法
System.out.println("父类方法");
}
}
class Dog extends Animal {
public Dog(String name, int age) {
super(name,age);
}
@Override //这表明父类方法被重写了
public void eat() { //子类重写父类方法
System.out.println(age + "岁的" + name + "正在吃狗粮");
}
public void bark() {
System.out.println("汪汪叫");
}
}
public class Test1 {
public static void eat(Animal animal) { //Animal animal就是父类的引用
animal.eat();
}
public static void main(String[] args) {
Animal animal =new Dog("狗狗",3);
eat(animal);
animal.eat(); //两者运行结果相同
}
}
值得注意的是:向上转型之后就不能调用了子类Dog特有的bark方法了
向下转型用到的方法是强制类型转换
我们来看一个实例
作用:检查对象实际类型 是否是 某个类或某个类的子类的类型
返回类型: boolean类型
格式:对象名 + instanceof + 类型
分别用多态和选择语句实现一个画图形功能
有四种图形:⚪,矩形,正方形,三角形,我们用类来描述
class Shape { public void draw() { System.out.println("画图型"); } } class Yuan extends Shape { @Override //重写 public void draw() { System.out.println("⚪"); } } class Juxing extends Shape { @Override //重写 public void draw() { System.out.println("矩形"); } } class Fang extends Shape { @Override public void draw() { System.out.println("正方形"); } } class San extends Shape { @Override public void draw() { System.out.println("三角形"); } }
选择语句实现
我们来看一下面的坑爹例子
package Test1; class B { public B() { func(); //构造方法中调用func方法 } public void func() { System.out.println("B.func()"); } } class D extends B { private int num = 1; @Override public void func() { //子类重写了父类的func方法 System.out.println("D.func() " + num); } } public class Test1 { public static void main(String[] args) { D d = new D(); } }
运行结果和分析
温馨提示
尽量不要在构造方法中调用其他方法
以上就是这篇文章的所有内容了
谢谢阅读本文,希望你能从中获得一些启发和思考
✨谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"✨
⭐️点赞收藏加关注,学习知识不迷路⭐️
✔️✔️✔️✔️
⛳️ 点赞
☀️收藏
⭐️ 关注
!
⛳️ 点赞
☀️收藏
⭐️ 关注
!
⛳️ 点赞
☀️收藏
⭐️ 关注
!
♂️♂️♂️♂️♂️♂️♂️♂️♂️♂️♂️♂️♂️