您的位置:首页 > 编程语言 > Java开发

java多态学习总结

2016-08-19 18:13 148 查看
Java语言的三大特性即是:封装、继承、多态


封装:

首先,属性可用来描述同一类事物的特征,方法可描述一类事物可做的操作。封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用。

1.概念:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。

2.好处:(1)实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

继承:

就是个性对共性的属性与方法的接受,并加入个性特有的属性与方法

1.概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。

2.目的:实现代码的复用。

3.理解:子类与父类的关系并不是日常生活中的父子关系,子类与父类而是一种特殊化与一般化的关系,是is-a的关系,子类是父类更加详细的分类。如class dog extends animal,就可以理解为dog is a animal.注意设计继承的时候,若要让某个类能继承,父类需适当开放访问权限,遵循里氏代换原则,即向修改关闭对扩展开放,也就是开-闭原则。

4.结果:继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。

另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。

多态:

多态的概念发展出来,是以封装和继承为基础的。

多态就是在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为去执行。)

1.概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

2.理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的,是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。

下面来聊聊

多态的存在有三个必要的条件:

要有继承(两个类之间存在继承关系,子类继承父类)
要有重写(在子类里面重写从父类继承下来的方法)


3 . 父类引用指向子类对象:


它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。[b]由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象
的。这就是“向上转型”。
那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的;[/b]

下面来一个小荔枝

<span style="color:#FFFFCC;"><span style="color:#3366FF;">package duotai;

/**
* 两个动物类继承
* @author fenuang
*有继承
*有重载
*有父类引用指向子类对象
*/
public class duotai {

public static void main(String[] args) {

Animal a = new Cat();
a.eat();
}

}

class Animal{

public void eat(){
System.out.println("动物会吃东西");
}
}

class Cat extends Animal{

public void eat(){
System.out.println("猫吃鱼");
}
}

class Dog extends Animal{

public void eat(){
System.out.println("狗吃骨头");
}
}</span>
</span>


运行结果是:


这三个条件一旦满足,当你调用父类里面被重写的方法的时候,实际当中new的是哪个子类对象,就调用子类对象的方法(这个方法是从父类继承下来后重写后的方法)。

再看下面一个栗子:

package duotai;

/**
*
* @author fenuang
*有父类引用指向子类对象
*/
public class duotai1 {

public static void main(String[] args) {

F f = new S();
System.out.println(f.price);

}

}

class F{
int price = 100;
}

class S extends F{
int price = 200;
}
运行结果为:



那么这是为什么呢:我们直觉上来看,应该是S类继承了F类;那么当父类引用指向子类对象的时候,应该是输出200才对呀

然而实际上,除了调用父类的方法会指向子类以外
其他全都是父类的东西

对于多态,可以总结以下几点:

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。


另转载:

多态是通过:

1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的

2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.

  面向对象比较强调类和类之间,对象和对象之间的一种组织关系,如果能把这种组织关系组织得比较好的话,你的程序想扩展性比较好,比较健壮,维护性比较好这些都可以达到,关键看你的设计到底好还是不好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多态 jvm class