Java面向对象概述及三大特征(封装,继承和多态)
一、面向对象思想
Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象!
它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计。面向对象程序的最小单元是类,类代表了客观世界中具有某一特征的一类事物,封装了这类事物所具有的属性和行为。
所以,类定义=成员变量(属性)+方法(行为)。
面向对象程序设计与人类的思维习惯一致,比如希望完成“兔子吃草"这件事:
在面向过程的程序设计里,一切以函数为中心,则会用如下语句来表达:
吃(兔子,草);
而在面向对象程序设计里,一切以对象为中心,则会用如下语句来表达:
兔子.吃(草);
对比这两条语句可以看出,面向对象语句更接近自然语言语法,主谓宾一目了然。
二、类与对象的关系
类是对象的抽象,对象则是类的实例,一个类可以生成多个对象。对一个类定义而言,包含三种最常见的成员:构造器、成员变量和方法,而构造器是一个类创建对象的根本途径,如果一个类没有构造器则无法创建实例。因此,如果程序员没有为一个类创建构造器,则系统会为该类提供一个默认无参的构造器。下面定义一个简单的Person类:
public class Person{
//定义两个成员变量:姓名和年龄
public String name;
public int age;
//定义一个say方法
public void say(String content){
System.out.println(content);
}
}
定义类之后就可以通过Person p = new Person()来创建对象了,Person对象赋给了p变量,它们在内存中的存储示意图如下:
三、面向对象的三个基本特征(封装,继承和多态)
1、封装
封装是指将对象的实现细节隐藏起来,对外提供公共访问方法,将对象的功能暴露出来。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
适当的封装可以让程式码更容易理解与维护,也加强了程序代码的安全性。最终目的是实现模块设计的”高内聚低耦合“。
那么,如何实现java的封装呢?首先来看一下java的访问控制级别:
Java提供了4个访问控制级别,由小到大如下图:
从上图可以得出,实现一个类封装的步骤如下:
♦ 修改属性的可见性(访问级别)来限制对属性的访问(一般限制为private),例如:
/**
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
*/
public class Person {
private String name;//姓名
private int age;//年龄
}
♦ 对每个值属性提供对外的公共方法访问,也就是创建一对赋值取值的方法,用于对私有属性的访问,例如:
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突,this指当前对象。
因此,一个类定义时,一般用private修饰成员变量,public修饰成员方法。获取成员变量应该用对象.get变量名()而不是对象.成员变量名。
2、继承
我们生活中有很多继承的例子:如兔子属于动物的一种,兔子有一般动物的特征及行为,在java语言里可以说兔子继承动物,兔子是子类,动物是父类;学生和老师都属于人类,有人的一般特性,所以在java语言里可以说学生和老师继承人类。所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
继承是指子类可以复用父类的属性和方法,Java的继承是单继承,每个子类只有一个直接父类。Java的继承通过extends关键字实现,实现继承的类称为子类,被继承的类称为父类(基类或超类)。Java继承语法格式如下:
修饰符 class SubClass extends SuperClass{
//类定义部分
}
需要注意的是 Java 不支持多继承,但支持多重继承。
子类包含与父类同名方法的现象称为方法重写,也称为方法覆盖。
方法的重写要遵循“两大两小一大”规则,“两同”即方法名相同、形参列表相同;“两小”指子类方法返回值类型应该比父类方法返回值类型要小或相等,子类方法声明抛出的异常应该比父类方法声明抛出的异常类要小或相等;“一大”指子类方法的访问权限应比父类方法的访问权限更大或相等。
3、多态
多态是指子类对象可以直接赋给父类变量(父类引用指向子类对象),但运行时依然表现出子类的行为特征,也就是说,同一类型的对象在执行同一个方法时,可能表现出多种行为特征。
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
比如:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
下面举一个多态的例子:
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
} public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
} abstract class Animal {
abstract void eat();
} class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
} class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
执行以上程序,输出结果为: 吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
如需转载,请注明作者(冰湖一角)和链接 https://www.cnblogs.com/bingyimeiling/p/10232605.html
欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!
▼微信扫一扫下图↓↓↓二维码关注
Java面向对象概述及三大特征(封装,继承和多态)的更多相关文章
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...
- 面向对象(OPP)的三大特征之 继承
OPP(面向对象编程的缩写)的三大优势: 1.继承 2.封装 3.多态 一.继承 1.继承:是两个对象之间的一种关系 a继承b 例如王思聪继承王健林 在OPP中继承是描述类与类之间的一种关系 2.继承 ...
- Java面向对象笔记 • 【第3章 继承与多态】
全部章节 >>>> 本章目录 3.1 包 3.1.1 自定义包 3.1.2 包的导入 3.1.3 包的访问权限 3.1.4 实践练习 3.2 继承 3.2.1 继承概述 3 ...
- Java面向对象理解_代码块_继承_多态_抽象_接口
面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...
- Java 抽象类与oop三大特征
面向对象主要有三大特性:继承和多态.封装. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为: abstract voi ...
- Java的OOP三大特征之一——继承
Java的OOP三大特征之一——继承 子类继承父类的特征和行为(属性和方法),使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类 ...
- Java 面向对象概述原理: 多态、Object类,转型(8)
Java 面向对象概述原理: 多态.Object类,转型(8) http://docs.oracle.com/javase/tutorial/java/IandI/override.html Java ...
- objective-c自学总结(三)---面向对象的封装,继承与多态
面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...
随机推荐
- SSH免密码登录Linux服务器
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=587 操作环境: 客户机操作系统:Ubuntu Linux 服务器操作系统:CentOS Linux 免密登陆的原理: ...
- Python题库
Date:2018-05-08 1.Given: an array containing hashes of names Return: a string formatted as a list of ...
- Eureka源码分析:Eureka不会进行二次Replication的原因
Eureka不会进行二次同步注册信息 Eureka会将本实例中的注册信息同步到它的peer节点上,这是我们都知道的特性.然而,当peer节点收到同步数据后,并不会将这些信息再同步到它自己的peer节点 ...
- 使用JWT的OAuth2的SSO分析
参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/oauth2/README.ado ...
- ArrayBlockingQueue简介
ArrayBlockingQueue基于数组,先进先出,从尾部插入到队列,从头部开始返回. 线程安全的有序阻塞队列,内部通过"互斥锁"保护竞争资源. 指定时间的阻塞读写 容量可限制 ...
- BZOJ_3191_[JLOI2013]卡牌游戏_概率DP
BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...
- POJ_2104_K-th Number_主席树
POJ_2104_K-th Number_主席树 题意:给定一个长度为n的序列,m次询问区间第k小 分析: 主席树模板 主席树可以理解成为n棵权值线段树的前缀和 但我们不能建n棵线段树,只需要对于每个 ...
- ie兼容问题记录
工作中遇到的ie网站兼容性问题 头疼.......... 以下为从网上搜索学习的整理兼容性方法 用于自己记录 #兼容问题 ##css hack: https://blog.csdn.net/fres ...
- 二维码神器QRCoder
好久没有写Blog,都是因为不小心坠入了爱河,时间都给我家那位了,都没时间加班了(嗨呀,不小心撒了一下狗粮),不过,还是希望单身的赶紧找到心仪的另一半,实在找不到,那就加班啊(开个玩笑,别认真). 二 ...
- JS 图片放大镜
今天练习一个小demo, 从本地读取图片, 然后实现类似淘宝放大镜的效果, 再加两个需求 1 .可以调节缩放比例,默认放大两倍 2 . 图片宽高自适应, 不固定宽高 话不多说先看效果: 原理:1, 右 ...