对Java中多态,封装,继承的认识(重要)
一.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中多态,封装,继承的认识(重要)的更多相关文章
- 关于java中多态的理解
java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...
- 个人对Java中多态的一些简单理解
什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...
- Java中多态的一些简单理解
什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...
- 深入Java核心 Java中多态的实现机制(1)
在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...
- 从虚拟机指令执行的角度分析JAVA中多态的实现原理
从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...
- Java 中多态的实现(下)
Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...
- Java中的封装
在前面的一些日子里,一只都在学习C#语言,使用C#在做一些小项目的,今天转到了Java的学习,还是感觉有点的不习惯,没有以前的中文界面的,全是英文.写起代码来都一直保持着C#中的编码的习惯,但是学习J ...
- Java中的封装、继承、多态
封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- java类的封装 继承 多态
1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...
随机推荐
- SQL Server 分页技术(存储过程)
alter proc proc_getpage ), )='*', ), )='asc', @pagesize int , @pageindex int, )='' as begin declare ...
- python实现图片批量剪裁的程序
from PIL import Image import os fin = 'D:/test' fout = 'D:/test2' for file in os.listdir(fin): file_ ...
- 源码剖析Django REST framework的认证方式及自定义认证
源码剖析Django REST framework的认证方式 在前面说过,请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封 ...
- unity3d开发环境配置
1. 首先先下载软件包:http://pan.baidu.com/s/1imYVv 4.2版本2.下载完后,解压会看到两个文件(运行第二个安装包) 3.准备安装,这里直接上图了. 这里全选,里面包括 ...
- [flask实践] 解决qq邮箱/mysql的相关配置问题
笔者经过flask web(Miguel著,封面是一条狗)一书的学习,打算实现一个旅游类网站,在此过程中发现,相对于书中的flasky博客程序,需要作出一些改变: 1. 注册邮箱:国内要使用126,q ...
- django框架中的中间件
什么是中间件 中间件就是在url进入路由之前进行检测的一个类 也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对 ...
- POJ2251-Dungeon Master
题意:给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是连 ...
- CCF-201409-2-画图
问题描述 试题编号: 201409-2 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩 ...
- cookie大小
一.浏览器允许每个域名所包含的cookie数: Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie. Firef ...
- C#基础,目录
首先,要说明一下本系列会以使用C#为侧重点,不会系统的.大篇量的去解说一些名词,比如:runtime.IL等.文章会在合适的时候对用到的基本概念进行简述.如果你是初学者,建议你也不要过度的去纠结,等你 ...