黑马程序员_java面向对象 多态
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、多态
多态:可以理解为事物存在的多种体现形态
一般重点为对象的多态性,像函数也有多态性,如重载。
1、多态的基本体现
父类的引用指向了自己的子类对象。即Animal c = new Cat()
父类的也可以接受自己的子类对象。即public static void function(Animal a)
具体程序解释:
abstract class Animal......................创建父类,抽象函数
{
abstract void eat();.................父类的方法(一下子类会继承),是子类的共性,但具体对象不同,就是
} 说要子类建立对象,使用时要覆盖。
class Cat extends Animal...............创建子类 猫 。继承父类。
{
public void eat().......................覆盖父类中的方法
{
System.out.println("吃鱼");
}
public void catchMouse()................子类自己特有属性
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal..............创建子类 狗 。继承父类
{
public void eat().......................覆盖父类中的方法
{
System.out.println("啃骨头");
}
public void kanJia()..................子类特有方法
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
/*
Cat c = new Cat();..........原先建立对象和其使用方法,即Cat c = new Cat() 通过这种方法建立一个对象,
c.eat(); 并用 类名.成员 进行调用。但是如果每建立一个对象就得重复使用,代码复用性
Dog d = new Dog(); 太低。建立调用函数的话,只是和对象有关,像function(Cat c),只在Cat对
d.eat(); 象建立时可用,一旦对象改变又得建立新的函数。既然Cat 和Dog有一样的动作,
*/ 所以可以进行如下程序的更改。
Animal c = new Cat();.....................通过父类建立对象,指向子类对象,一般有继承和实现关系的类与类
c .cat(); 就可以应用
function(new Cat());.........................函数调用方法,此处new Cat(),其实就是Animal c = new Cat();
}
public static void function(Animal a)
{
a.eat();
}
}
2、多态的好处
多态的出现,提高了程序的拓展性
3、多态的前提
必须是类与类之间有关系,要么继承,要么实现。
一般来说,存在覆盖。就是说一般多态是对事物共性的描述。
此处注意:对事物共性的描述,其实就是集成,即是对事物共性部分进行抽取,单独成一类,该私有的私有,该抽象的抽象
4、多态的弊端
提高了拓展性,但是只能使用父类的引用访问父类中的成员。
而且要注意类型的转换:
Animal c = new Cat();其实这里进行类型的转换,把猫提升为动物,类似byte b = 3;int x = b;类型提升了,就是向上转型。具体程序:
class DuoTaiDemo2
{
public static void main(String[] args)
{
Animal c = new Cat();//类型提升,向上转型
c.eat();
如果想要调用猫的方法时,如何操作
类型强制转换,转换成子类类型,乡下转型
Cat c = (Cat)c;
Animal a = new Animal();//如果父类可以建立对象
Cat c = (Cat)c;// 此处是错误的,动物不能强转为猫,从属关系不一样
就是说,不能将父类转换为子类类类型
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,可以被强转
多态自始至终都是子类对象在做着变化
}
public static void function(Animal a)
{
a.eat();
if (a instanceof Cat)//关键字instanceof
{
Cat c = (Cat)a;
c.catchMouse();
}
}
}
5、多态的应用
实例程序
abstract class Student......................对对象进行抽取,父类,抽象类
{
public abstract void study();................两个功能
public void sleep()
{
System.out.println("躺着睡");
}
}
class BaseStudent extends Student
{
public void study()
{
System.out.println("base study");
}
public void sleep()
{
System.out.println("坐着睡");
}
}
class AdvStudent extends Student
{
public void study()
{
System.out.println("adv study");
}
public void sleep()
{
System.out.println("站着睡");
}
}
class teacher.......................................定义老师类,进行功能调用,基于多态
{
public static void doSome(Student a)....注意此处,多态,父类接受子类对象,其实也是父类指向子类对象
{
a.study();
a.sleep();
}
}
class DuoTaiDemo3
{
public static void main(String[] args)
{
teacher.doSome(new AdvStudent());...函数静态化,直接类名调用即可
}
}
6、多态中成员特点
成员函数特点(指非静态函数):
编译时期:引用型变量所属的类中是否有调用的方法,如果有,编译通过。
运行时期:对象所属类中是否有调用方法
简单就是,成员函数在调用时,编译看左边,运行看右边。
成员变量特点:
无论编译和运行,都参考左边。
静态成员特点:
无论编译和运行,都参考左边
二、object类
object是所有类的根类,其中定义的是所有对象都具备的功能
如果自定义类中也有比较相同的功能,没有必要重新定义
只要沿袭父类中的功能,建立自己特有比较内容即可,就是覆盖。
equals比较的是对象的内存地址值
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------