一、面向对象思想

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面向对象概述及三大特征(封装,继承和多态)的更多相关文章

  1. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  2. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  3. 面向对象(OPP)的三大特征之 继承

    OPP(面向对象编程的缩写)的三大优势: 1.继承 2.封装 3.多态 一.继承 1.继承:是两个对象之间的一种关系 a继承b 例如王思聪继承王健林 在OPP中继承是描述类与类之间的一种关系 2.继承 ...

  4. Java面向对象笔记 • 【第3章 继承与多态】

    全部章节   >>>> 本章目录 3.1 包 3.1.1 自定义包 3.1.2 包的导入 3.1.3 包的访问权限 3.1.4 实践练习 3.2 继承 3.2.1 继承概述 3 ...

  5. Java面向对象理解_代码块_继承_多态_抽象_接口

    面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...

  6. Java 抽象类与oop三大特征

    面向对象主要有三大特性:继承和多态.封装. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为: abstract voi ...

  7. Java的OOP三大特征之一——继承

    Java的OOP三大特征之一——继承 子类继承父类的特征和行为(属性和方法),使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类 ...

  8. Java 面向对象概述原理: 多态、Object类,转型(8)

    Java 面向对象概述原理: 多态.Object类,转型(8) http://docs.oracle.com/javase/tutorial/java/IandI/override.html Java ...

  9. objective-c自学总结(三)---面向对象的封装,继承与多态

    面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...

随机推荐

  1. Dubbo源码-Dubbo是如何随心所欲自定义XML标签的

    叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...

  2. Android 百分比布局库(percent-support-lib) 解析与扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...

  3. 玩转Spring MVC(二)----MVC框架

    早期程序员在编写代码时是没有一个规范的,系统的业务逻辑和数据库的访问时混合在一起的,不仅增加了大量的重复工作,而且增加了后期维护的难度. 后来,人们逐渐发现某些通用的功能是可以单独的封装起来的,这样就 ...

  4. Go-技篇第一 技巧杂烩

    Go-技篇第一 技巧杂烩 一句话技巧 把你面向对象的大脑扔到家里吧,去拥抱接口.@mikegehard 学习如何使用Go的方式做事,不要把别的的编程风格强行用在Go里面.@DrNic 多用接口总比少用 ...

  5. 【codeforces 718E】E. Matvey's Birthday

    题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串 ...

  6. BZOJ_1975_[Sdoi2010]魔法猪学院_A*

    BZOJ_1975_[Sdoi2010]魔法猪学院_A* Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPi ...

  7. BZOJ_3697_采药人的路径_点分治

    BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...

  8. .NET Core 迁移躺坑记

    最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...

  9. TensorFlow从1到2(九)迁移学习

    迁移学习基本概念 迁移学习是这两年比较火的一个话题,主要原因是在当前的机器学习中,样本数据的获取是成本最高的一块.而迁移学习可以有效的把原有的学习经验(对于模型就是模型本身及其训练好的权重值)带入到新 ...

  10. 手把手学会MySql主从配置

    001 开启二进制日志. vi /data/mysql/port-3306/my.cnf log-bin=mysql-bin 002 在master上为从主机新建一个专门用于同步的账户,并授权REPL ...