1. 继承案例
package cn.hncu_01;
/*
* 猫狗案例讲解(继承版)
*/
class Animal {
// 成员变量
private String name;
private int age;
// 构造方法
public Animal() {
super();
// TODO Auto-generated constructor stub
}
public Animal(String name, int age) {
super();
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("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
}
//狗类
class Dog extends Animal {
public Dog() {
super();
// TODO Auto-generated constructor stub
}
public Dog(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
public void eat() {
System.out.println("狗吃肉");
}
public void sleep() {
System.out.println("狗趴着睡觉");
}
}
//猫类
class Cat extends Animal {
public Cat() {
super();
// TODO Auto-generated constructor stub
}
public Cat(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫躺着睡觉");
}
}
public class Demo {
public static void main(String[] args) {
//测试狗类
Dog dog = new Dog();
dog.setName("来福");
dog.setAge(2);
System.out.println(dog.getName()+"---"+dog.getAge());
System.out.println("---------------------------------");
Dog dog2 = new Dog("旺财",3);
System.out.println(dog2.getName()+"---"+dog2.getAge());
System.out.println("---------------------------------");
//测试猫类,自己测
}
}
2. 多态的概念
package cn.hncu_02;
/*
* 多态
* 1. 什么是多态?
* 同一个对象在不同时刻体现出来的不同状态.
* 如:水(固态,液态,气态)
* 猫是猫, 猫是动物
* 2. 多态的前提
* (1) 有继承关系.
* (2) 有方法重写.
* (3) 有父类引用指向子类对象.
* Fu f = new Zi();
*
* 3. 根据多态的前提,写一个案例
*
*
*
*/
class Fu {
public void method(){
System.out.println("method Fu");
}
}
class Zi extends Fu{
public void method(){
System.out.println("method Zi");
}
}
public class Demo {
public static void main(String[] args) {
//有父类引用指向子类对象
//这就是多态
Fu f = new Zi();
f.method();
}
}
3. 多态中成员访问的特点
package cn.hncu_03;
/*
* 多态中成员访问的特点:
*成员变量
* 编译看左边,运行看左边
*构造方法
* 创建子类对象时,先访问父类的构造方法,对父类的数据进行初始化.(和继承中一样)
* 成员方法
* 编译看左边,运行看右边
* 静态方法
* 编译看左边,运行看左边
*/
class Fu {
public int num1=10;
public Fu(){
System.out.println("Fu无参构造");
}
public void method(){
System.out.println("method Fu");
}
public static void fun(){
System.out.println("fun Fu");
}
}
class Zi extends Fu{
public int num1 = 20;
public int num2 = 200;
public Zi(){
System.out.println("Zi无参构造");
}
public void method(){
System.out.println("method Zi");
}
public void function(){
System.out.println("function Zi");
}
public static void fun(){
System.out.println("fun Zi");
}
}
public class Demo {
public static void main(String[] args) {
//有父类引用指向子类对象
//这就是多态
Fu f = new Zi();
//f.method();
//System.out.println(f.num1);//10
//System.out.println(f.num2);
//f.method();
//f.function();
f.fun();
}
}
4. 多态的好处
package cn.hncu_04;
/*
* 多态的好处
* (1) 提高了代码的维护性(由继承保证).
* (2) 提高了代码的扩展性(由多态保证).
*
* 需求:写一个动物的工具类.
*/
class Animal {
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
class Dog extends Animal {
public void eat(){
System.out.println("狗吃饭");
}
public void sleep(){
System.out.println("狗睡觉");
}
}
class Cat extends Animal {
public void eat(){
System.out.println("猫吃饭");
}
public void sleep(){
System.out.println("猫睡觉");
}
}
class Pig extends Animal {
public void eat(){
System.out.println("猪吃饭");
}
public void sleep(){
System.out.println("猪睡觉");
}
}
//这是一个动物的工具类
/*
* 如何写一个工具类?
* 工具类是一个工具,一般不让别人创建对象(私有化构造方法),希望通过类名直接调用方法(方法都写成静态方法).
*/
class AnimalTools {
private AnimalTools(){
}
//调用狗的功能
//类名做形参,实际需要的是该类的一个对象.
/*public static void useDog(Dog d){
d.eat();
d.sleep();
}
public static void useCat(Cat c){
c.eat();
c.sleep();
}
public static void usePig(Pig p){
p.eat();
p.sleep();
}*/
//动物的种类有很多,安卓上面的方法写动物工具类不合适.
public static void useAnimal(Animal a){
a.eat();
a.sleep();
}
}
public class Demo {
public static void main(String[] args) {
//AnimalTools at = new AnimalTools();
/*Dog dog = new Dog();
AnimalTools.useDog(dog);
AnimalTools.useCat(new Cat());
AnimalTools.usePig(new Pig());*/
AnimalTools.useAnimal(new Dog());//Animal a = new Dog(),这就是多态
AnimalTools.useAnimal(new Cat());
AnimalTools.useAnimal(new Pig());
}
}
5. 多态的弊端
package cn.hncu_05;
/*
* 多态的弊端
* 不能使用子类的特有功能.怎么解决?
* 解决的办法有两个:
* (1) 直接创建子类对象调用子类方法即可.
* (2) 向下转型.
* Fu f = new Zi()
* Zi z = (Zi) f;
* 总结:
* java 中的转型问题.
* 向上转型:Fu f = new Zi()
* 向下转型:Zi z = (Zi) f
*/
class Fu {
public void function(){
System.out.println("function Fu");
}
}
class Zi extends Fu {
public void function(){
System.out.println("function Zi");
}
public void method(){
System.out.println("method Zi");
}
}
public class Demo {
public static void main(String[] args) {
/*Fu f = new Zi();
f.function();*/
//f.method();
/*Zi z = new Zi();
z.method();
z.function();*/
Fu f = new Zi();
Zi z = (Zi) f;//向下转型
z.method();
z.function();
}
}
案例
package cn.hncu_06;
/*
* 猫狗案例练习多态版
*/
class Animal {
// 成员变量
private String name;
private int age;
// 构造方法
public Animal() {
super();
// TODO Auto-generated constructor stub
}
public Animal(String name, int age) {
super();
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("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
}
//狗类
class Dog extends Animal {
public Dog() {
super();
// TODO Auto-generated constructor stub
}
public Dog(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
public void eat() {
System.out.println("狗吃肉");
}
public void sleep() {
System.out.println("狗趴着睡觉");
}
}
//猫类
class Cat extends Animal {
public Cat() {
super();
// TODO Auto-generated constructor stub
}
public Cat(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫躺着睡觉");
}
}
public class Demo {
public static void main(String[] args) {
//多态的方法测试狗
Animal a = new Dog();
a.eat();
a.sleep();
//多态的方法测试猫
a = new Cat();
a.eat();
a.sleep();
}
}
本文通过猫狗案例展示了Java中的继承概念,详细解释了多态的定义、前提条件,并通过实例演示了多态在成员访问中的特点。接着探讨了多态在代码维护性和扩展性上的优势,以及在动物工具类场景下的应用。同时,文章也提到了多态的潜在弊端,如无法直接调用子类特有方法,并给出了解决方案。最后,通过多态方法测试了狗和猫的行为。
260

被折叠的 条评论
为什么被折叠?



