1.多态
package Base_se.Base_012.b01;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package Base_se.Base_012.b01;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package Base_se.Base_012.b01;
public class AnimalDemo {
public static void main(String[] args) {
// 有父类引用指向子类对象
Animal a = new Cat();
}
}
2.多态中成员访问特点
package Base_se.Base_012.b02;
public class Animal {
public int age =40;
public void eat() {
System.out.println("动物吃东西");
}
}
package Base_se.Base_012.b02;
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void play() {
System.out.println("玩游戏");
}
}
package Base_se.Base_012.b02;
public class AnimalDemo {
public static void main(String[] args) {
// 有父类引用指向子类对象
Animal a = new Cat();
// 访问成员变量:编译和运行都要看左边的
System.out.println(a.age); //40
// System.out.println(a.weight);
// 访问成员方法 编译左边 运行右边
a.eat();
// a.play();
}
}
3.多态的利弊
package Base_se.Base_012.b03;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
package Base_se.Base_012.b03;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package Base_se.Base_012.b03;
public class Pig extends Animal{
@Override
public void eat() {
System.out.println("猪");
}
}
package Base_se.Base_012.b03;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗");
}
public void Look(){
System.out.println("看");
}
}
package Base_se.Base_012.b03;
public class AnimalOpti {
// public void useAnimal(Cat c){
// c.eat();
// }
//
// public void useAnimal(Dog d){
// d.eat();
// }
public void useAnimal(Animal a){
// Animal a = new Cat();
// Animal a = new Cat();
a.eat();
// a.look(); 不能访问的子类的特有方法
}
}
package Base_se.Base_012.b03;
public class AnimalDemo {
public static void main(String[] args) {
// 创建动物操作类的对象,调用方法
AnimalOpti ao = new AnimalOpti();
Cat cat = new Cat();
ao.useAnimal(cat);
Dog d = new Dog();
ao.useAnimal(d);
Pig pig = new Pig();
ao.useAnimal(pig);
}
}
4.多态中的转型
package Base_se.Base_012.b04;
public class Animal {
public void ext(){
System.out.println("动物吃东西");
}
}
package Base_se.Base_012.b04;
public class Cat extends Animal{
@Override
public void ext(){
System.out.println("猫吃鱼");
}
public void play(){
System.out.println("玩耍");
}
}
package Base_se.Base_012.b04;
public class AnimalDemo {
/*
* 向上转型:从子到父 父类引用指向子类对象
向下转型:从父到子 父类引用转为子类对象
* */
public static void main(String[] args) {
// 多态
Animal a = new Cat(); // 向上转型
a.ext();
// a.play();
// Cat cat = new Cat();
// cat.ext();
// cat.play();
// 向下转型
Cat c = (Cat) a; //强制转换为Cat 类型的
c.ext();
c.play();
}
}
5.多态内存图解
6.案例
package Base_se.Base_012.b05;
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(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 eat(){
System.out.println("动物吃东西");
}
}
package Base_se.Base_012.b05;
public class Cat extends Animal{
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫");
}
}
package Base_se.Base_012.b05;
public class AnimalDemo {
public static void main(String[] args) {
// 创建猫类对象
Animal a = new Cat();
a.setName("加菲");
a.setAge(12);
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Cat("加菲",13);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
7.抽象类
package Base_se.Base_012.b006;
public abstract class Animal {
// public void eat(){
// System.out.println("吃东西");
// }
// 抽象方法
// 抽象方法必须是抽象类 抽象类可以没有抽象方法 但是没什么意义
public abstract void eat();
public void sleep() {
System.out.println("睡觉");
}
}
package Base_se.Base_012.b006;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫");
}
}
package Base_se.Base_012.b006;
public class Dog extends Animal{
@Override
public void eat(){
System.out.println(111);
}
}
package Base_se.Base_012.b006;
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.sleep();
Animal d = new Dog();
d.eat();
}
}
8.抽象类的成员特点
package Base_se.Base_012.b07;
import javax.swing.*;
public abstract class Animal {
private int age = 20;
private final String city = "北京";
public Animal(int age) {
this.age = age;
}
public Animal() {
}
public void show() {
age = 40;
System.out.println(age);
System.out.println(city);
}
public abstract void eat();
}
package Base_se.Base_012.b07;
public class Cat extends Animal{
@Override
public void eat(){
System.out.println("猫");
}
}
package Base_se.Base_012.b07;
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.show();
}
}