Java中的面向对象

在软件开发的学习中, 我最先接触的开发语言就是java,但都是简单的函数和循环数组的应用。说道面向对象,第一次看到这个词的时候还是在C#的学习过程中,我记得当时PPT上霸气的解释,什么是对象?万物皆对象!够霸气吧,当时的面向对象思想对我来说还是挺崩溃的,什么继承多态啊!经过了无数的联系项目的书写,终于对面向对象有了一定的理解,现在刚好在java的学习中再度重温面向对象,那么就将我眼中的面向对象写出来分享给大家。

说到面向对象,我们就不得不提一下他的三大特性,继承封装和多态。我们先从封装说起,什么是封装呢?就是把对象的属性和操作联合为一个整体,并且隐藏内部实现细节。这个说法比较官方,简单的说就是把属性用private修饰,然后建立公有方法给属性赋值,并且在方法中控制给属性赋值的规则。在上代码之前给大家分享一个MyEclipse封装的快捷方式,写好了私有属性后按alt+shift+s出现菜单栏后再按r就可以全部封装了。

public class Student {
private String stuname;
private int stuage;
private int stuscore;// 光标定位在这里按快捷键
public Student(String name,int age,int score){
this.stuname = name;
this.stuage = age;
this.stuscore = score;
}
public String getStuname() {
return stuname;
} public void setStuname(String stuname) {
this.stuname = stuname;
} public int getStuage() {
return stuage;
} public void setStuage(int stuage) {
this.stuage = stuage;
} public int getStuscore() {
return stuscore;
} public void setStuscore(int stuscore) {
this.stuscore = stuscore;
} public void say(){
System.out.println(this.stuname+"正在和大家打招呼");
}
}

上面就是对一个对象的封装,可以在set方法里添加赋值需求。借着上面封装好的类,我们来看下一个特性,也就是继承。继承在我们日常生活中的理解就是从我们的上一辈或者上司老师那里获取到他的东西,而且一般是全部的东西,那么继承在java中是什么意思呢?继承就是从已有的类中派生出新的类,新的类能够吸收已有类的数据和行为,并能扩展新的能力。一般将这个已有类称为父类或是基类,而新的类称为子类或派生类。在java继承特性中,只能实现单继承,也就是所有子类只能有一个父类,子类继承父类的关键字是extends后面跟上类名。

下面是一个张三类,他继承了Student类,并且覆盖了类中的say方法:

public class StuZS extends Student {

    public StuZS(String name, int age, int score) {
super(name, age, score);
}
public void say(){
System.out.println("大家好!");
} }

在这里有几点需要注意的地方,在父类中的私有属性或方法在子类中是不能被继承的,也就是说这时候StuZS类不能直接使用stuname变量,需要使用类中的set(赋值)get(取值)方法。如果在父类中有一个带参的构造函数并且没有无参的构造函数,那么子类在继承父类之后,必须有相同构造函数并且函数中的第一条语句要调用父类中的构造函数,因为当你实例化出子类对象的时候,会先走到父类的构造函数中执行再回到子类的构造函数中。所以如果我们的父类中有一个带参构造,那么基于后面的代码的友好书写,再加一个无参的构造函数。

现在我们知道了子类可以使用父类的方法,那么现在问题来了,如果子类中有和父类重名的属性或方法,那该怎么办呢?正子类中有和父类的重名方法我们叫做覆盖,也就是说重写了父类的方法,在调用的时候可以把两个类的方法看成一种,但是其实是不一样,在子类中通过this和super关键字可以区分出来,this调用的是本类的方法,super调用的是父类方法,属性也是一样,代码如下:

public class StuZS extends Student {

    public StuZS(String name, int age, int score) {
super(name, age, score); }
public void say(){
System.out.println("大家好!");
}
public void thisAndSuper(){
this.say();
super.say();
} }
    public static void main(String[] args) {
StuZS stu = new StuZS("张三", 20, 100);
stu.thisAndSuper();
}

这段代码会输出“张三正在和大家打招呼”和“大家好!”两句话,所以说我们在子类中可以区分出这个方法或属性到底属于谁。但是我们想想这样做有什么意义呢,我们继承的目的就是要子类可以使用父类的属性或方法,让他们“不分彼此”,而父类我们一般只是将方法与属性创建出来,所以父类say()方法中的内容时多余的,用不到的,那么就出现了我们的抽象方法。java中的抽象方法用abstract关键字修饰。在给大家看具体代码前先看一下抽象方法的几个特性和注意事项:

1、抽象方法所在的类必然是抽象类,抽象类同样用abstract修饰

2、抽象类中可以有普通方法和属性

3、抽象方法不能有方法体

4、子类必须重写父类的抽象方法,除非子类本身也是一个抽象类

5、抽象类不能被实例化

好了抽象类和抽象方法的一些基本注意事项我们也了解了,那么下面的事情就简单了,我们只需要稍稍的修改一下代码就OK了:

public class StuZS extends Student {

    public StuZS(String name, int age, int score) {
super(name, age, score); }
@Override
public void say() {
// TODO Auto-generated method stub }
public void thisAndSuper(){
this.say();
super.say();
}
}

这样我们再用super调用父类方法的时候会发现报出了红线,是不可以被调用的。

下面就是我们今天的重头戏,也就是多态,前面的封装和继承几乎都是在为多态做着准备,那么什么是多态呢?还是先来一段官方的解释:多态性是指允许不同类的对象对同一消息作出响应,多态包括参数化和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名的问题。多态既然这么牛,那么多态都有什么好处呢?下面我们来一一列举:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要

看到了多态的这么多好处,是不是觉得很厉害的样子,就让我们来看看多态在代码中的呈现方式(一段神绕的代码,大家自行观看,夜深了):

public class StuA {
public void say(StuD stu){
System.out.println("D say Hello");
}
public void say(StuA stu){
System.out.println("A say Hello");
} } public class StuB extends StuA {
public void say(StuA stu){
System.out.println("A say Hello");
}
public void say(StuD stu){
System.out.println("B say Hello");
} } public class StuD extends StuA {
public void say(StuA stu){
System.out.println("A say Hello");
}
public void say(StuB stu){
System.out.println("B say Hello");
} } public static void main(String[] args) {
StuA a = new StuA();
StuB b = new StuB();
StuD d = new StuD();
a.say(b);
a.say(d);
b.say(a);
b.say(b);
d.say(d);
d.say(d); }

在这我也帮不了大家什么,绕出来多态你就理解的差不多了,运行结果给大家,我要睡觉去了。

A say Hello
D say Hello
A say Hello
A say Hello
D say Hello
D say Hello

Java中的面向对象的更多相关文章

  1. java中的面向对象的三大基本特征

    转载,原文来自http://blog.sina.com.cn/s/blog_5f79a56a0100c6ig.html 众所周知,java中的面向对象的三大基本特征是:[封装].[继承].[多态] 一 ...

  2. Java中的面向对象I

    一.首先来了解一下Java面向对象的五个程序设计方式: 1.万物皆对象 Java以类为基本模块来将问题抽象化,在计算机中解决实际生活中的问题 2.程序为对象的集合,程序中的类通过互发消息来告知彼此要做 ...

  3. Java中的面向对象II

    既然要创建一个对象那么就需要有一个类,下面介绍类的构建. 一.类的两个元素: 1.字段 字段也就是类变量,每一个类变量都是类的成员. <1.>类变量访问指定通常是私有的(private)或 ...

  4. JAVA中的面向对象与内存解析_2

    构造方法(构造函数)   • 使用new +构造方法创建一个新的对象. • 构造函数是定义在Java类中的一个用来初始化对象的函数. • 构造函数与类同名且没有返回值. • 例如:Person类的构造 ...

  5. JAVA中的面向对象与内存解析_1

    对象的创建和引用   必须使用new关键字创建对象. 使用对象(引用成员变量或来引用对象的成员变量. 使用对象(引用)方法(参数列表)来调用对象的方法. 同一类的每个对象有不同的成员变量存储空间. 同 ...

  6. 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)

    ---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...

  7. 浅谈Java中的AOP面向切面的变成和控制反转IOC

    https://blog.csdn.net/hi_kevin/article/details/7325554 https://www.cnblogs.com/zedosu/p/6632260.html ...

  8. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  9. java中一个重要思想:面向对象

    面向对象: 1, 面向过程的思想(合适的方法出现在合适的类里面) 准备去一个地方: 先买车, 挂牌, 开导航, 踩油门, 过黄河, 穿越珠穆朗玛峰... 2, 面向对象的思想 我开着车去, 车怎么去随 ...

随机推荐

  1. 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010    一.菜单项(CCMenuItem) 菜单项 ...

  2. xcopy拷贝判断是否成功 robocopy排除子目录

    xcopy \\172.16.22.65\server\*.* C:\Inetpub\wwwroot\Server /h /r /s /yif %errorlevel% neq 0 echo copy ...

  3. Scribefire发CSDN博客

    历史 在非常久非常久曾经,CSDN是支持外部工具来写文章的,但是在还有一个非常久非常久曾经就不行了. 突然看到CSDN有能够用外部工具来写博客了(CSDN的公告),一直以来都纠结这个问题,CSDN的编 ...

  4. hdu4759 Poker Shuffle 2013 ACM/ICPC Asia Regional Changchun Online

    找了很久的规律,只看十进制数字,各种乱七八糟的规律=没规律!看了别人的解题报告,虽然看懂了,可是怎么发现的这个规律呢T.T~想了很久很久~ 以下是转载的别人的图,自己再画太麻烦了~全部看出0~2n-1 ...

  5. dialog统一标准调用方法(内部记录)

    更新base-config.js 对话框统一为三种形式(如后期需要再添加其他方式) //对话框--确定取消 //dialogOkFun:确定函数 dialogCancelFun:取消函数 functi ...

  6. 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个对立的元素存于vector中

    #include<iostream> #include<string> #include<vector> #include<fstream> using ...

  7. UNIX标准化及实现之功能测试宏

    在头文件中定义了很多POSIX.1和XSI的符号.但是除了POSIX.1和XSI的定义之外,大多数实现在这些头文件中也加上了它们自己的定义.如果在编译一个程序时,希望它只使用POSIX定义而不使用任何 ...

  8. c#_delegate_异步调用_BeginInvoke

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. linux 命令学习日记 20160621

    1.cat /proc/meminfo 观察Linux系统上虚拟内存的当前状态 2.ipcs -m ipcs命令专门用来查看系统上的当前共享内存页面 3.ls /dev -al sda* ttyS* ...

  10. java.lang.NoSuchFieldError: RAW_XML_FILE_HEADER,调用XWPFTemplate动态合并生成一个新的docx文档时报错

    在使用 org.apache.poi 对office文件  根据表单内容和已上次的附件 动态合并成一个新的文档时,本地调试完全ok 但是发布倒Linux环境上就老是报这个错误java.lang.NoS ...