初学JAVA-8-对象和类、面向过程和面向对象
其实本来准备这篇笔记先写数组,再通过Scanner引入简单的人机交互,之后再引出对象和类,面向过程和面向对象这个话题的。但是我思考了半天,还是决定先时候说对象和类、面向过程和面向对象这些事情。从我写第三篇笔记开始,我就一直感觉写的磕磕绊绊,从我们的第一个HelloWorld的例子开始,到上一个等差数列求和,所有的这些问题,我们都是在一个方法里完成的。是的,public static void main(String[] args),这个主方法,没有出过这个圈。
我们都知道,JAVA是面向对象的语言,但是到现在为止,我们没有介绍过任何和面向对象有关的内容。全都是面向过程。忽然间我感觉,也许最开始我们就应该解释,什么是面向对象,什么是面向过程。我们最开始也使用了著名的HelloWorld作为第一个Java程序,但是这个程序最早是从C语言里面出来的。C语言是最著名的面向过程的语言。
什么是面向过程?面对具体问题,从问题本身出发,关注问题解决的过程的编程思路,就是面向过程。比如我们之前举例的,对这个学生的成绩分析,然后写了一段代码。现在我们要分析这个学生的健康情况,我们再写一段代码,来解决这个问题。如果再分析这个学生的考勤情况呢,我们再写一段代码...我们关注的是一个个问题。
什么是面向对象?关注事物本身,从事物本身出发,关注事物的属性和行为,就是面向对象的基本思想。比如上面所说的,我们从学生本身出发,学生的成绩,身体各项指标,考勤等都是这个学生的属性,上课、请假、体检、考试这些,甚至是逃课,都是这个学生的行为。我们从学生的层面来分析他的成绩,分析他的健康状况和考勤情况。
也许你要问,那面向过程有什么区别?难道不还是要面对这些问题吗?不还是要写成绩分析的代码,健康情况分析的代码,考勤分析的代码吗?是的,编程最终还是要解决具体问题,但是和面向过程不同的是,我们的代码有了联系,成为了一个整体。当我们继续扩展,我们把学生的社会活动情况也纳入进来,面向过程只是多了一块代码,而面向对象却多了一块拼图。如果我们再扩展,把教师也添加进来,那从面向对象的角度,我们基本上已经可以构建一个学校了。而面向过程,只是多了另一堆代码。
既然是面向对象,那总得有对象,那么什么是对象?什么是类?类我们已经知道了,我们之前的HelloWorld, MyFirstJavaClass, MySecondJavaClass,这都是类。然而就是这几个类,可能会让人更加迷惑,类的概念更加混乱。因为这些都是我们为了解决问题而创建的类,比如为了输出HelloWorld,为了计算1加到100,为了计算1+3+5+7...这是为了解决问题而创建的类,这是面向过程的思想。
什么是类?类是一种区分,类是一种抽象,将一些具有相同属性和行为的对象提取出来,就成为了类。比如人类。也许人类这个词一瞬间拯救了你的大脑,你有一种豁然开朗的感觉,你正想努力理解类是什么,忽然看到人类这个词,你瞬间就明白了。也许我们对人类无法做最精确的定义,但是这个词瞬间把我们和动物、植物分开了。人类有什么属性?有身高、体重、性别、肤色等等等等,那人类有哪些行为?吃饭,睡觉,娱乐等等等等。有了人类,我们自然的知道还有其他的种类,比如哺乳类、爬行类、飞行类、植物里面有乔木类、灌木类等等。我们提取事物的共同特点,将他们归为一类。这个能力是面向对象的基本能力,我们称为抽象。
与抽象对应的是具体,比如姚明打篮球,林丹打羽毛球,马龙打乒乓球,潘长江演小品,贾玲说相声这些都是很具体的对象,但是我们根据他们的特点,可以简单的将他们分为体育明星和文艺明星。我们也可以简单的将他们分为男明星和女明星。如果我们从职业特性来进行抽象,那我们现在可以分别定义这两个类了:SportStar 和 ArtStar。如果我们从性别角度来进行抽象,那我们可以定义另外两个类:MaleStar和FemaleStar。
那么什么是对象?对象是类的实例,是类的具体表象。比如体育明星里,姚明是一个对象,马龙是一个对象,林丹是一个对象。文艺明星里,潘长江是一个对象,贾玲是一个对象。
我们说过,面向对象关注事物的本身,关注事物的属性和行为,那么我们考虑一下体育明星有哪些属性和行为?比如姓名、性别、身高、从事的体育项目,这些是体育明星的属性;训练、休息、参赛、出席记者招待会等等,这些是他们的行为。在Java里,如何根据他们这些属性和行为定义这个类呢?
//声明一个名为SportStar的类,用来表示体育明星
public class SportStar{
//声明体育明星的属性:姓名
public String name;
//声明体育明星的属性:性别
public String sex;
//声明体育明星的属性:身高
public double height;
//声明体育明星的属性:年龄
public int age;
//声明体育明星的属性:从事体育项目
public String sport; //声明体育明星行为:训练
public String train(){
String result = name+"变得更强了";
return result;
} //声明体育明星的行为:休息
public void rest(){
System.out.println(name+"休息了");
}
//声明体育明星的行为:参赛
public void match(String sportname){
System.out.println(name+"正在参加"+sportname);
} //声明体育明星的行为:出席记者招待会
public String meeting(boolean flag){
if(flag){
return name+"参加了记者招待会";
}else{
return name+"拒绝参加记者招待会";
}
} //声明体育明星的行为:提供个人信息
public String myInformation(){
String information = "姓名:"+name+","+sex+","+age+"岁,身高"+height+"米,"+"从事"+sport+"运动";
return information;
}
}
上面我们定义了一个SportStar类,声明了他的各种属性和行为。我们可以看到,声明类的属性,就是在这个类里面声明变量。声明类的行为,就是定义一些方法。我们发现这个类没有main方法,那他怎么执行呢?我们现在要创建一个具体对象,要怎么操作呢?
我们说过,main方法是程序的入口,我们最好不要在我们的类里提供main方法,我们专门提供一个类来为系统服务。
public class OfferServer{
public static void main(String[] args){ SportStar star = new SportStar();
star.name = "姚明";
star.sex = "男";
star.height=2.26;
star.age = 38;
star.sport = "篮球";
String info = star.myInformation();
System.out.println(info);
star.match("亚运会"); SportStar star1 = new SportStar();
star1.name = "林丹";
star1.sex = "男";
star1.height=1.78;
star1.age = 35;
star1.sport = "羽毛球";
String info1 = star1.myInformation();
System.out.println(info1);
star1.match("世锦赛");
String mess = star1.meeting(false);
System.out.println(mess);
}}
在java中我们使用new关键字来创建一个新的对象,在上面的程序中,我们使用了SportStar star和SportStar sta
r1分别声明了两个体育类明星,然后用他们指向两个新创建的SportStar对象,然后给这两个SportStar对象分别设置了姓名、年龄、身高、性别、参与的体育项目,并让他们提供了自身信息,以及分别让他们参加了亚洲杯和世锦赛,另外我们还让第二个对象拒绝参加新闻发布会...
构造方法
public class OfferServer{public static void main(String[] args){OfferServer server = new OfferServer();}}
上面的代码中我们创建了一个OfferServer类的对象,那么创建一个对象的时候需要:
实际上,我们调用的就是这个构建方法,每个JAVA类都有一个默认的构建方法,这个方法是不带参数的,我们可以以显示的形式来重写这个构造方法。一个类可以有多个构造方法,但是构造方法的声明部分不能相同。
}
我们可以看到,与普通方法相比,构造方法是没有返回类型的,构造方法的名字必须和类名完全一致,构造方法可以没有参数,也可以有一个或者多个参数。还是以运动明星举例,我们现在为它添加几个构造方法。
//声明一个名为SportStar的类,用来表示体育明星
public class SportStar{//声明体育明星的属性:姓名public String name; //声明体育明星的属性:性别public String sex;//声明体育明星的属性:身高public double height;//声明体育明星的属性:年龄public int age;//声明体育明星的属性:从事体育项目public String sport;//不带参数的构造方法public SportStar(){this.name = "马龙";this.sex = "男";} //带一个String参数的构造方法public SportStar(String name){this.name = name;}//带两个参数的构造方法public SportStar(String name,String sex){this.name = name;this.sex = sex;}//带多个参数的构造方法public SportStar(String name,String sex,double height,int age,String sport){this.name = name;this.sex = sex;this.height = height;this.age = age;this.sport = sport;}//带更多参数的构造方法public SportStar(String name,String sex,double height,int age,String sport,String message){this.name = name;this.sex = sex;this.height = height;this.age = age;this.sport = sport;System.out.println(message);} //声明体育明星行为:训练public String train(){String result = name+"变得更强了";return result;}//声明体育明星的行为:休息public void rest(){System.out.println(name+"休息了");}//声明体育明星的行为:参赛public void match(String sportname){System.out.println(name+"正在参加"+sportname); }//声明体育明星的行为:出席记者招待会public String meeting(boolean flag){if(flag){return name+"参加了记者招待会";}else{return name+"拒绝参加记者招待会";}}//声明体育明星的行为:提供个人信息public void myInformation(){String information = "姓名:"+name+","+sex+","+age+"岁,身高"+height+"米,"+"从事"+sport+"运动";System.out.println(information);}
}
在上面的例子中,我们一共定义了不带参数,带一个参数,带两个参数,带多个参数,带更多个参数的5个构造方法,现在我们来看看不同的构造方法的使用
public class OfferServer{public static void main(String[] args){//调用不带参数的构造方法SportStar star1 = new SportStar();star1.myInformation();//调用带一个参数的构造方法SportStar star2 = new SportStar("张继科");star2.myInformation();//调用带两个参数的构造方法SportStar star3 = new SportStar("梅西","男");star3.myInformation();//调用带多个参数的构造方法SportStar star4 = new SportStar("朱婷","女",1.98,24,"排球");star4.myInformation();//调用带更多参数的构造方法SportStar star5 = new SportStar("迈克尔乔丹","男",1.98,55,"篮球","全世界最伟大的篮球运动员");star5.myInformation();}}
我们在设计构造方法时,一般是根据这个类的主要属性来设计,因为我们是需要对具体对象的属性做初始化,所以虽然我们可以设置参数多于对象属性个数的构造方法,但是我们并不建议这样做,程序设计需要有实际意义。
另外,我们说过创建对象时会初始化这个对象,也就是说这个对象的属性其实都已经设定值了,如果我们没有在初始化的时候为这些属性设定值,那么系统会默认为其设定值:整型类型变量属性默认为0,浮点型默认为0.0,布尔型默认为false,char类型默认为''(空字符文字),对象类型默认为null。
在许多其他的文档资料中,对构造方法有许多不同的叫法,比如构建器、构造函数、构建方法、构建函数等等,我们只要知道这些都是指创建对象的方法就行了。
null
我们在上面的例子演示中看到了null,null是什么?null是一个非常非常特殊的值,它基本上是所有对象的默认初始化值。当表示当前引用的对象为空。在面试中我们经常会遇到的一个问题是String s = "";和String s = null;有什么区别?“”是一个长度为0的字符串对象,它是String类的实例,是真实存在的,而null表示当前的引用为空。我们只能用String类型的引用变量来 指向“”,而不能用其他类型的引用变量,比如我们不能用SportStar类型的引用变量来指向“”,SportStar star = ""是不正确的。但是SportStar star = null;是可以的,它表示我们声明了一个SportStar类型的引用变量,它指向空。
请注意,除了少数的操作,任何对null的引用都会招来失败,比如SportStar star = null;star.myInformation();由于我们的引用变量star此时指向一个null,所以凭空调用它的myInformation方法是失败的,虚拟机毫不客气的送给你一个NullPointerException(空指针异常)。
null可以做哪些操作?
除了我们上面说的初始化以外,还可以做==和!=判断,而且为了我们的代码安全,为了JVM不会动不动就给我们抛出NullPointerException,我们还经常会做这个操作,判断一个对象是不是空。
this
public class OfferServer{public OfferServer(){}public OfferServer(String message){this();System.out.println(message);}public OfferServer(String message,boolean flag){this(message);if(flag){System.out.println("再输出一遍"+message);}}public static void main(String[] args){OfferServer of = new OfferServer("你好");of = new OfferServer("真的吗",true);of = new OfferServer("真的吗",false);}}
需要注意的是
属性的访问
//声明一个名为SportStar的类,用来表示体育明星
public class SportStar{//声明体育明星的属性:姓名private String name; //声明体育明星的属性:性别private String sex;//声明体育明星的属性:身高private double height;//声明体育明星的属性:年龄private int age;//声明体育明星的属性:从事体育项目//提供设置姓名的方法public void setName(String name){this.name = name;} //提供读取姓名的方法public String getName(){return this.name;}//提供设置性别的方法public void setSex(String sex){this.sex = sex;}//提供读取性别的方法public String getSex(){return this.sex;}//提供设置身高的方法public void setHeight(double height){this.height = height;} //提供读取身高的方法public double getHeight(){return this.height;}//提供设置年龄的方法public void setAge(int age){this.age = age;} //提供读取年龄的方法public int getAge(){return this.age;}//提供设置体育项目的方法public void setSport(String sport){this.sport = sport;}//提供读取体育项目的方法public String getSport(){return this.sport;}public String sport;//不带参数的构造方法public SportStar(){this.name = "马龙";this.sex = "男";} //带一个String参数的构造方法public SportStar(String name){this.name = name;}//带两个参数的构造方法public SportStar(String name,String sex){this.name = name;this.sex = sex;}//带多个参数的构造方法public SportStar(String name,String sex,double height,int age,String sport){this.name = name;this.sex = sex;this.height = height;this.age = age;this.sport = sport;}//带更多参数的构造方法public SportStar(String name,String sex,double height,int age,String sport,String message){this.name = name;this.sex = sex;this.height = height;this.age = age;this.sport = sport;System.out.println(message);} //声明体育明星行为:训练public String train(){String result = name+"变得更强了";return result;}//声明体育明星的行为:休息public void rest(){System.out.println(name+"休息了");}//声明体育明星的行为:参赛public void match(String sportname){System.out.println(name+"正在参加"+sportname); }//声明体育明星的行为:出席记者招待会public String meeting(boolean flag){if(flag){return name+"参加了记者招待会";}else{return name+"拒绝参加记者招待会";}}public void myInformation(){String information = "姓名:"+name+","+sex+","+age+"岁,身高"+height+"米,"+"从事"+sport+"运动";System.out.println(information);}
}
上面的代码中我们把全部的属性都替换成了private的,然后为每个属性设置了一个设置(setter)方法和一个读取方法(getter) 。有时候我们我们不希望我们的一些属性提供给外部设置,比如年龄。如果我们为我们的SportStar增加一个birthday的属性,那么我们其实可以根据生日来确定年龄。当生日被设置的时候,他的年龄也已经确定了。而且年龄只会随着时间的增加而增加,试想一下,我们设置了一个人的生日是2000年1月1日,然后设置他的年龄是80岁,是不是很可笑?除非你是在2080年1月1日看到这篇文章。
初学JAVA-8-对象和类、面向过程和面向对象相关推荐
- JAVA入门级教学之(面向过程和面向对象的区别)
目录 JAVA入门级教学之(面向过程和面向对象的区别) 面向过程和面向对象的区别: -面向过程: -面向对象: -发展历程: -生命周期中包括: -什么是类: -什么是对象: -软件开发的过程: -重 ...
- 面向过程和面向对象的设计思想、java类、Java类的定义、java对象、对象的创建和使用、类和对象、变量分类、方法分类、构造方法、方法的重载
1.面向过程和面向对象的设计思想 面向过程:procedure oriented programming 缩写 POP. 分析出解决问题所需要的步骤,然后把步骤一步一步实现. 面向过程直接关注流程. ...
- java面向过程和面向对象
面向过程(Procedure Oriented):说的是功能的行为 面向对象(Object Oriented,简称OO):说的是功能的对象 面向过程理解: 当学习java的时候先了解java语言优良的 ...
- java知识点7——面向过程和面向对象、面向对象的内存分析、构造方法
面向过程和面向对象 解决简单问题可以使用面向过程 解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向 ...
- java面向过程编程怎么写_从面向过程到面向对象,我的编程之路
也许现在新一代的程序员一开始涉足的就是c++,C#,Java这类面向对象的语言,如果这样,这篇文章可能得不到他们的认同. 这里,我只想写写我从面向过程到面向对象开发成长中的一些感想而已. 我最初学习的 ...
- Java 从面向过程走向面向对象的程序设计思想
什么是面向过程?面向对象? 它们都是解决问题的思路 我用一个生活的例子来区别它们: 起床,洗漱,吃饭--等这些都是生活中的事 吃饭:我们想吃饭之前要做饭,饭菜可以是自己做,或者爸妈做,也可以下馆子 面 ...
- 【 js基础 Day4】面向过程,面向对象,自定义对象,内置对象
01 复习 函数:把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 函数作用:代码重用 函数的参数: 1.形参:函数定义的时候,函数名字后面的小括号里的变量 2.实参:函数调 ...
- java对象与类ppt,JAVA语言对象与类.ppt
JAVA语言对象与类.ppt 第三章 对象与类,3.1 类与对象 3.2 定义类 3.3 成员变量的作用域 3.4 方法重载 3.5 创建对象 3.6 构造方法 3.7 this关键字 3.8 初始化 ...
- 《Java程序设计》实验报告——Java的对象与类
浙江理工大学 <Java程序设计> 实验报告 20 19-20 20学年第 1学期 学 院 信息学院 班 级 计算机科学与技术18(3) 姓 名 申屠志刚 学 号 2 ...
最新文章
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
- 跟vczh看实例学编译原理——一:Tinymoe的设计哲学
- Debian卸载iceweasel
- 从数据传输的角度辨析表单设计时的 get 和 post 提交方法
- 编程语言性能实测,Go 比 Python 更胜一筹?
- CF 2A-Winner
- Python2.X和Python3.X文件对话框、下拉列表的不同
- 热力地图高德_《高德地图》城市热力图开启查看方法
- python读取像素值
- 晋商到底是怎么生与死的?
- 【GLPNet2021】GLOBAL-LOCAL PROPAGATION NETWORK FOR RGB-D SEMANTIC SEGMENTATION
- HTML制作虾米音乐,如何用jQuery仿虾米音乐网完整源码
- Unity3D 模型描边插件Outline Effect详细使用说明、C#功能扩展
- 微信php页面你画我猜,微信小程序你画我猜
- Centos7安装开启BBR加速
- Secure Code Warrlor学习记录(三)
- mq服务器与客户端消息同步,RocketMQ:主从同步的实现
- Mybatis实战练习六【批量删除Mybatis参数传递】
- HashMap中Entry以及Hash值的理解
- EBox4300 Dev Start