一.Java面向对象编程有三大特性:封装,继承,多态

在了解多态之前我觉得应该先了解一下封装和继承的概念,个人觉得继承和封装都是为了多态服务的,且看我一一道来!

1.封装:将属性private,提供public的方法来访问private属性,这样对数据就设置了访问权限,使得程序更加的安全

实例:

 1 package test_1;
2 class Time {
3 private int hour;
4 private int minute;
5
6 public int getHour() {
7 return hour;
8 }
9 public void setHour(int hour) {
10 this.hour = hour;
11 }
12 public int getMinute() {
13 return minute;
14 }
15 public void setMinute(int minute) {
16 this.minute = minute;
17 }
18 }

2.继承:子类继承父类,就是为了重用父类的代码,这样在子类中就可以不写那些重复的代码,使得程序更加的精简

实例:(接着上面的例子来的)

1 class Clock extends Time {
2
3 public static void main(String[] args) {
4 Clock clock = new Clock();
5 clock.setHour(11);
6 clock.setMinute(11);
7 System.out.println(clock.getHour()+":"+clock.getMinute());
8 }
9 }//结果:11:11

分析:在Clock这个类中我并没有写属性和方法,但是它有输出能调用Time类中的属性和方法,是因为他继承了Time类,这样就精简了代码

3.多态:相同的方法,不同的对象调用,产生不同的行为(个人一句话总结)

既然现在对多态有了一个概念上的认识,那么我们就必须知道多态的实现条件

 二.多态的实现条件:继承,重写,向上转型

继承:在多态中必须有存在继承关系的子类和父类

重写:子类继承了父类,那么就继承了父类中的所有方法,如果在子类中对父类中存在的一部分方法进行了重写编写,那么这个过程就叫重写,在调用这些方法的时候就不会调用父类中的这些方法,而是调用子类中被重写的方法,这样才能产生多态行为

向上转型:一句话:父类引用指向子类对象

 //假如现在有个父类Father和子类Son
//向上转型:父类引用指向子类对象
Father f1 = new Son();// f是一个父类的引用,但是它却指向了一个子类Son的对象,这个就叫做向上转型 //既然说到了向上转型,也简单说一下向下转型,(接着上的例子)
//向下转型:把指向子类对象的父类引用赋给子类引用
Son s1 = new (SOn)f1;
//f1是一个指向子类对象的父类引用,被赋给了一个子类引用,这个叫做向下转型 Father f2 = new Father();
Son s2 = new (Son)f2//错误,不可以进行向下转型,因为f2是一个指向父类的父类引用

向上转型的缺点:只能访问父类中拥有的方法和属性,对于子类中存在但是父类中存在的方法和属性,是不能调用的,即使重载该方法,若子类重写了父类中的某些方法,在调用该方法的时候,一定是调用的子类中重写的方法,而不是调用父类中被重写的方法

只有满足了上面三个条件,我们才能在同一个继承结构中使用同意的逻辑代码处理不同的对象,从而产生多态行为

  三.多态实现的两种方式:

1.继承实现

看一个经典例子,摘自:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html

 public class A {
public String show(D obj) {
return ("A and D");
} public String show(A obj) {
return ("A and A");
} } public class B extends A{
public String show(B obj){
return ("B and B");
} public String show(A obj){
return ("B and A");
}
} public class C extends B{ } public class D extends B{ } public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D(); System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
/*运行结果:
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
*/

分析:

1.A abd A:a1.show(b),a1是一个父类引用指向父类对象,所以调用的方法都是A类本身的,参数b为B型,又因为B继承了A,所以调用的是A中的show(A obj),所以输出是A and A

2.A and A:a1.show(c),a1是一个父类引用指向父类对象,所以调用的方法都是A类本身的,参数c为C型,但是C继承于B,B继承于A,所以调用的方法仍是show(A obj),所以输出是A and A

3.A and D:a1.show(d),a1是一个父类引用指向父类对象,所以调用的方法都是A类本身的,而d是D型的,所以调用的是show(D obj),所以输出是A and D

4.B and A :a2.show(b),a2是一个父类引用指向子类对象,属于向上转型,不清楚的可以看上面向上转型的定义,又因为属于向上转型,子类中有的但是父类中不存在的方法show(B obj)是不能狗被调用的,子类对父类中show(A obj)进行了重写,所以 a2能用的方法只有show(D obj),show(A obj)(这个方法是B类中的那个),参数b为B型,又因为B继承于A,所以调用的是show(A obj)(这个方法是B类中的那个),所以输出为B and A

5.B and A :a2.show(c),通过上面可以知道a2能调用的方法只有show(D obj),show(A obj)(这个方法是B类中的那个),参数c是C型的,又因为C继承于B,B继承于A,所以输出为B and A

6.A and D:a2.show(d),通过4可以知道a2能调用的方法只有show(D obj),show(A obj)(这个方法是B类中的那个),又因为d是D型,所以a2调用的是show(D obj),所以输出为A and D

7.B and B:b.show(b),b是一个父类指向父类的对象,但是因为B继承了A,所以b能调用的方法有show(D obj)(A中的方法,通过继承得来),show(B obj)(B本身的),show(A obj)(重写的A中的),参数b是b型的,所以调用的是show(B obj),所以输出是B and B

8.B and B: b.show(c),通过7知道b能调用的方法只有三个,参数c为C型,C继承于B,因为b可调用的方法中有有面向B的,所以不会因为c为C型,C继承于B,B又继承于A而去调用show(A obj),而是调用show(B obj),所以输出是B and B

9.A and D,b.show(d),通过7知道b能调用的方法只有三个,参数d为D型,所以调用的是show(D obj)(A中的方法,通过继承得来),所以输出为A and D

2.接口实现

经典例子:摘自http://blog.csdn.net/oguro/article/details/53086720

 interface Dao{  //接口的方法全部都是非静态的方法。

     public void add();

     public void delete();
} //接口的实现类
class UserDao implements Dao{ public void add(){
System.out.println("添加员工成功!!");
} public void delete(){
System.out.println("删除员工成功!!");
} } class Demo3
{
public static void main(String[] args)
{
//实现关系下的多态
Dao d = new UserDao(); //接口的引用类型变量指向了接口实现类的对象。
d.add(); }
}

接口实现多态分析:接口类型的引用变量指向了接口实现类的对象,上面代码中Dao就是接口类型,UserDao就是接口实现类的对象,UserDao实现了Dao这个接口

接口 变量  = new 接口实现类对象

总结:

多态两种实现方法总结:父类的引用类型变量指向了子类对象或者是接口类型的引用变量指向了接口实现类的对象

多态机制遵循的原则总结:当父类对象引用变量引用子类对象的时候,被引用对象的类型而不是引用变量的类型决定了调用哪些方法,但是这个被调用的方法必须是在父类中定义过的,也就是说被子类重写的方法!

不足错误之处,欢迎兄弟们拍砖!!!

对Java中多态,封装,继承的认识(重要)的更多相关文章

  1. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  2. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  3. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  4. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  5. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  6. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  7. Java中的封装

    在前面的一些日子里,一只都在学习C#语言,使用C#在做一些小项目的,今天转到了Java的学习,还是感觉有点的不习惯,没有以前的中文界面的,全是英文.写起代码来都一直保持着C#中的编码的习惯,但是学习J ...

  8. Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...

  9. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  10. java类的封装 继承 多态

    1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...

随机推荐

  1. Python之re正则模块

    正则表达式可以帮助我们更好的描述复制的文本格式,可以更好地利用它们对文本数据进行检索.替换.提取和修改操作. http://www.cnblogs.com/huxi/archive/2010/07/0 ...

  2. 了解python,利用python来制作日常猜拳,猜价小游戏

    初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构 ...

  3. 初识CC_MVPMatrix

    初识CC_MVPMatrix CC_MVPMatrix是一个mat4类型的uniform,在shader代码被编译之前,它由cocos2d-x框架插入进来的. bool GLProgram::comp ...

  4. C语言之计算log2

    #include<stdio.h>int main(){int num,count=0,i=0,ret=0;scanf("%d",&num);count=num ...

  5. ionic3中 ion-datetime 全屏可点击问题解决方案

    废话不多说,能进来的都应该知道是个什么情况.我也是在网上找了一段时间,才在git上ionic官方团队的Issues中找到了问题解决方法. 第一,给外围包上一层ion-item,但是这有个问题,就是会让 ...

  6. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  7. 【C#入门教案-02】用记事本编写第一个C#程序-Hello World

    02-用记事本编写第一个C#程序-Hello World 广东职业技术学院  欧浩源 [1]进行.NET程序开发的最基本环境配备 .NET Framework + 代码编辑工具(记事本或Noetpad ...

  8. 自己动手编写IOC框架(三)

    刚写博客浏览量第一天就有1000多人次,给了我很大的鼓舞决定熬夜再写一篇.对于前两篇来说无非就是使用dtd验证xml,然后解析xml,和IOC的核心还是差的很远,相信很多小伙伴们都感觉看得不过瘾了,这 ...

  9. 蓝桥杯 牌型种数 DFS

    牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  10. PHP简单实现购物车

    首先,判断是否登录.if(isset($_session['user_id'])){ 存在: 把用户id和商品id,加入购物车表}else{ 不存在:使用cookie把商品ID和主机IP放入一个数组 ...