文档章节

Java面向对象概述及三大特征(封装,继承和多态)

编辑之路
 编辑之路
发布于 01/10 14:03
字数 1835
阅读 45
收藏 7

一、面向对象思想

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();

  当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

  多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

        在此我向大家推荐一个架构学习交流圈:830478757  帮助突破瓶颈 提升思维能力

  下面举一个多态的例子:

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("看家");  
    }  
}

 

 

 

执行以上程序,输出结果为:

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

© 著作权归作者所有

编辑之路
粉丝 54
博文 50
码字总数 109912
作品 0
长沙
私信 提问
【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

一、前言 小编记得,刚接触计算机相关的课程的时候,接触的是c++,c++的老师一上来就说c++是面向对象的,c语言是面向过程的。面向对象比面向过程厉害,是从面向过程发展过来的的。 当时有一个...

kisscatforever
2018/03/28
0
0
正在学习Java SE,为什么感觉学习Java就是在学习一些API。

正在学习Java SE,为什么感觉学习Java SE就是在学习一些API(目前只在少部分重要的地方学习源码)。例如Java的IO流中,就是在学习他们的各种结构关系(继承关系等),它们的构造方法,成员方...

秋风秋雨
2017/04/01
343
7
「JAVA基础」面向对象的特征有哪些方面

老师为大家整理JAVA基础:面向对象的特征有哪些方面 面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关...

启示录是真的
2018/06/01
0
0
面向对象的三大特征

面向对象的三大特征:继承,多态,封装 类的继承: Java的继承通过extends来实现,实现继承的类称为子类(派生类),被继承的类称为父类(基类或超类)。例如:狗是动物的一种,也可以说够继承...

晨曦之光
2012/05/16
805
0
初试刀 浅谈Java和C#在面向对象上语法的区别

 做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识。细小的知识从头细细嚼来,别有一番滋味。或是以前遗漏的太多,或是确实没有系统的学习过,教...

夜默
2013/06/18
48
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
8
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
8
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部