Java中的面向对象
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中的面向对象的更多相关文章
- java中的面向对象的三大基本特征
转载,原文来自http://blog.sina.com.cn/s/blog_5f79a56a0100c6ig.html 众所周知,java中的面向对象的三大基本特征是:[封装].[继承].[多态] 一 ...
- Java中的面向对象I
一.首先来了解一下Java面向对象的五个程序设计方式: 1.万物皆对象 Java以类为基本模块来将问题抽象化,在计算机中解决实际生活中的问题 2.程序为对象的集合,程序中的类通过互发消息来告知彼此要做 ...
- Java中的面向对象II
既然要创建一个对象那么就需要有一个类,下面介绍类的构建. 一.类的两个元素: 1.字段 字段也就是类变量,每一个类变量都是类的成员. <1.>类变量访问指定通常是私有的(private)或 ...
- JAVA中的面向对象与内存解析_2
构造方法(构造函数) • 使用new +构造方法创建一个新的对象. • 构造函数是定义在Java类中的一个用来初始化对象的函数. • 构造函数与类同名且没有返回值. • 例如:Person类的构造 ...
- JAVA中的面向对象与内存解析_1
对象的创建和引用 必须使用new关键字创建对象. 使用对象(引用成员变量或来引用对象的成员变量. 使用对象(引用)方法(参数列表)来调用对象的方法. 同一类的每个对象有不同的成员变量存储空间. 同 ...
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...
- 浅谈Java中的AOP面向切面的变成和控制反转IOC
https://blog.csdn.net/hi_kevin/article/details/7325554 https://www.cnblogs.com/zedosu/p/6632260.html ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- java中一个重要思想:面向对象
面向对象: 1, 面向过程的思想(合适的方法出现在合适的类里面) 准备去一个地方: 先买车, 挂牌, 开导航, 踩油门, 过黄河, 穿越珠穆朗玛峰... 2, 面向对象的思想 我开着车去, 车怎么去随 ...
随机推荐
- [AngularJS] Introduction to angular-formly
<!DOCTYPE html> <html> <head> <!-- Each of these scripts are the latest version ...
- 用GDB排查Python程序故障
某Team在用Python开发一些代码,涉及子进程以及设法消除僵尸进程的需求.实践中他们碰上Python程序非预期退出的现象.最初他们决定用GDB调试Python解释器,查看exit()的源头 ...
- php一些技术要点连接地址
http基本认证: http://www.php.net/manual/zh/features.http-auth.php
- java_spring_依赖注入
IOC反转控制 PersonService属性 PersonDao personDao接受通过xml注入的对象 PersonDaoBean. Person中save()调用 PersonDaoBea ...
- ping与telnet的区别
ping 查看某个IP地址是否有效.还可以得出解析IP..评估网络质量.telnet 查看可以PING通IP的机子上的某个端口是否可以进行访问(telnet IP port) ,如果连接失败,可能是防 ...
- vs2012新建实体数据模型(EF)时无Mysql数据源
sql转mysql数据库,用到EF,遇到vs2012新建实体数据模型时无Mysql数据源的问题. 问题截图如下: 解决方法1:(简单的的解决方法,有可能解决问题,如不能解决问题,请看解决方法2): ( ...
- 设定范围和步长的递增数验证器Validator
1.接口注释 @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Docume ...
- TableView不显示没内容的Cell怎么办?
类似这种,我不想让下面那些空的显示. 很简单: self.tableView.tableFooterView = [[UIView alloc] init]; 加完这句之后就变成了这样:
- sysctl
/proc/sys目录下存放着大多数内核参数,并且可以在系统运行时进行更改,不过重新启动机器就会失效./etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/ ...
- How to use Oprofile tool to analysis program's performance
You can get Oprofile RPM from https://www.rpmfind.net/ How to use Oprofile tools: Get report Steps: ...