一.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. Celery 源码解析六:Events 的实现

    在 Celery 中,除了远程控制之外,还有一个元素可以让我们对分布式中的任务的状态有所掌控,而且从实际意义上来说,这个元素对 Celery 更为重要,这就是在本文中将要说到的 Event. 在 Ce ...

  2. C++雾中风景3:const用法的小结

    const作为C与C++共有的关键字,很多使用的方式大同小异.但由于C++是一门面向对象的语言,在类和对象中有更多的使用规则.之前学习C语言的时候就被const这个关键字搅得焦头烂额,正巧也借这篇文章 ...

  3. CSS-笔记1-选择器与文本元素

    知识点一: CSS概念:CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表) Css是用来美化html标签的,相当于页面化妆. 知识点二: 选择器格式与部分属性: 写法 ...

  4. JavaScript各种继承方式和优缺点

    好久没写博客啦,嘻嘻,这个月是2017年的最后一个月啦,大家应该都开始忙着写年终总结了吧,嘻嘻,小颖今天给大家分享下Javascript中的几种继承方式以及他们的优缺点. 1.借助构造函数实现继承 原 ...

  5. linux磁盘管理系列-软RAID的实现

    1 什么是RAID RAID全称是独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想是把多个磁盘组合起来,组合一个磁盘阵列组,使得性能大幅提高. R ...

  6. GO学习——安装编译(1)

    学习网站列表: Golang官网:https://golang.org/ Golang标准库文档:https://golang.org/pkg Golang中文标准库文档:https://studyg ...

  7. mysql 双机热备注意事项

    上一篇文章已经介绍过    主从复制,   本文对主从复制只是简单描述,如对主从复制不清楚的,可以先看上一篇文章   主从复制  一:介绍 mysql版本:5.7.20 第一个主服服务器ip:192. ...

  8. Java基础(二)-static关键字分析

    static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...

  9. C#自定义ip控件

    前言:由于项目中有ip输入,但C#中又没有IP控件,如果直接放4个TextBox感觉又怎么好,还不好控制,于是可以通过自定义控件的方式来解决,就又了下面的自定义ip控件,该控件功能基本完善,如果还有未 ...

  10. 2、C#基础 - Visual Studio 的版本选择和下载

    有句话说:工欲善其事,必先利其器,我不推荐在学习一个语言时使用记事本练习,甚至说相当的排斥.当然了,你也可以选择你自己喜欢的方式.本系列推荐使用的IDE为vs2017 community版,银子不够的 ...