java实现多态有三要素:
1、要有继承关系
2、要有方法的重写
子类可以不重写父类中的方法,但是重写了会更好的体现子类的特点
3、要有父类的引用指向子类对象
点击查看代码
class Animal2{
String name;
int age;
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("睡");
}
}
class Dog2 extends Animal2{
@Override
public void eat(){
System.out.println("🐕吃🥩");
}
@Override
public void sleep(){
System.out.println("🐕侧着睡");
}
}
class Cat2 extends Animal2{
@Override
public void eat(){
System.out.println("🐱吃🐟");
}
@Override
public void sleep(){
System.out.println("🐱蜷着睡");
}
}
public class DuoTaiDemo1 {
public static void main(String[] args) {
//要有父类的引用指向子类对象
Animal2 a1 = new Dog2(); // 类与类之间的多态
// Dog2 d1 = new Cat2();
}
}
多态访问成员的特点:
成员变量:编译看左,运行看左。
成员方法:编译看左,运行看右。
静态成员方法:编译看左,运行看左。
点击查看代码
class Fu10 {
int a = 10;
public void fun1() {
System.out.println("好好学习,天天向上!");
}
public static void show1() {
System.out.println("这是父类中的静态方法show1");
}
}
class Zi10 extends Fu10 {
int a = 20;
@Override
public void fun1() {
System.out.println("在数加科技里好好学习!");
}
// public void fun1() {
// System.out.println("在数加科技里好好学习!");
// }
public static void show1() {
System.out.println("这是子类中的静态方法show1");
}
}
public class DuoTaiDemo2 {
public static void main(String[] args) {
Fu10 f = new Zi10();
System.out.println(f.a);
f.fun1();
f.show1();
}
}
多态的好处:
1、提高了程序的维护性(由继承保证)
2、提高了程序的扩展性(由多态保证)
构建一个父类工具包
点击查看代码
class AnimalTool{
public static void useAnimal(Animal animal){ // Animal animal = new Cat()
animal.eat();
animal.sleep();
}
}
class Demo{
public static void main(String[] args) {
//现在我想养一只🐕
Dog d1 = new Dog();
AnimalTool.useAnimal(d1); // new Dog()
Cat c1 = new Cat();
AnimalTool.useAnimal(c1); // new Cat()
}
}
在多态中取得子类其他方法(非需要重写的方法)
向下转型
格式: 子类类名 变量名 = (子类类名)要转型的变量名;
点击查看代码
class Fu1{
public void fun1(){
System.out.println("好好学习,天天向上!");
}
}
class Zi1 extends Fu1{
@Override
public void fun1() {
System.out.println("李刚现在在数加好好学习,天天向上!");
}
public void show1(){
System.out.println("李刚现在没有睡觉...");
}
}
class Demo1 extends Fu1{
}
public class DuoTaiDemo2 {
public static void main(String[] args) {
Fu1 f1 = new Zi1();
f1.fun1();
// f1.show1();
//向下转型
//格式: 子类类名 变量名 = (子类类名)要转型的变量名;
Zi1 z1 = (Zi1)f1;
z1.show1();
//并不是任意两个类型之间都可以做向下转型,只有实际内存对象类型与要转的类型一样
// Demo1 d1 = (Demo1) f1; //ClassCastException
}
}
不同地方饮食文化不同的案例
点击查看代码
/*
不同地方饮食文化不同的案例
Person
eat()
SouthPerson
eat()
NorthPerson
eat()
*/
class Person{
public void eat(){
System.out.println("吃");
}
}
class SouthPerson extends Person{
@Override
public void eat() {
System.out.println("南方人吃🍚");
}
public void daMaJiang(){
System.out.println("南方人喜欢打麻将");
}
}
class NorthPerson extends Person{
@Override
public void eat() {
System.out.println("北方人是🍜");
}
public void shuaiJiao(){
System.out.println("北方人喜欢🤼");
}
}
public class DuoTaiTest {
public static void main(String[] args) {
Person p1 = new SouthPerson();
p1.eat();
// p1.daMaJiang();
System.out.println("-------------------");
SouthPerson sp = (SouthPerson) p1;
sp.eat();
sp.daMaJiang();
}
}