目录
步入面向对象。对象?什么是面向对象?男\女朋友?主类地位最高?(计算圆锥的面积【用面向对象、方法的创建利用编程】)
1、什么是面向对象
2、面向对象的三大特征
①封装
②继承
③多态
3、创建对象的语法
4、三个与面向对象有关的英文
①OOA
②OOD
③OOP
5、第一个面向对象的例子(计算圆锥的体积Volme)
①不含Scanner
②含Scanner
6、程序运行结果
对象?女/男朋友?No!No!No!在Java面向对象这块有一个梗“缺对象嘛?我给你new一个”所以说Java编程里的对象都是new出来的。如果是把Java里的对象看作现实中的对象,咱们的地位就蛮高的,因为大多数事情不需要亲自去干,无需亲历亲为,让对象去帮你干就可以啦!这样想象一下,当你想喝水,你可以让你的男/女朋友让你准备好杯子、倒好水,最后放在你面前喂你喝,我们只需要坐在电脑椅上张开嘴就好了。面向对象就是看着对象做,我静候结果。在百度上的解释着这样的。
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。
方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。
继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率。在这里举一个例子,当类X继承了类Y后,此时的类X则是一个派生类,而类Y属于一个基类。继承是从一般演绎到特殊的过程,可以减少知识表示的冗余内容,知识库的维护和修正都非常方便。更有利于衍生复杂的系统。
类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。
封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。
多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。
动态绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。
消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。
本段内容来源于网络,详细请看“什么是面向对象”。
封装、继承、多态。
封装的字面意思就是把物品密封起来并加以包装,我对Java里的封装的理解,就类似于加工,将原材料放在光鲜亮丽的纸壳子或者塑料里面,让你能用却不知道他是怎么构成的,就像一张纸可以说是木材、木屑的封装;或者更加形象一点,打个不恰当的比喻,去医院看望生病的朋友,我们会买上一个果篮,诶!这些包装好的水果就是一个封装好的事物,你不用去纠结苹果是怎么种的,这个这么大的苹果、这么红的苹果是否打了蜡,也不用去琢磨他是怎么打包的,你只用知道“哦~苹果,好吃,有营养,可以送朋友”就可以了,这是我对封装这个名词的理解。而在网络上的名词解释是这样的。
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。在电子方面,封装是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接。
在面向对象编程中,封装(encapsulation)是将对象运行所需的资源封装在程序对象中——基本上,是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可以看作是一个自我包含的原子。对象接口包括了公共的方法和初始化数据。
程序
封装 (encapsulation)
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
封装途径
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口(后面的知识点),以特定的访问权限来使用类的成员。
封装在网络编程里面的意思, 当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络,其中每一层对收到的数据都要增加一些首部。
本段内容来源于网络,详细请看“什么是封装”。
面向对象是一个让我们感到很舒服的东西,因为它和我们现实十分贴切,尤其是这个继承,很好理解,就用最近特别流行的话“你想继承我的花呗嘛?”就我的理解这个意思就是“I am father!”我的花呗欠了1000,我子类的花呗也一样,所以让子类帮我还八倍。简而言之,父母祖先有的到了我这里我也有,同时我也会拥有他们没有的东西,所以在Java编程过程中,在父类里定义的方法,在子类也可以用,同时子类又可以创建新的父类没有方法。在网络上继承的定义解释是这样的。
继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。例如:先定义一个类叫车,车有以下属性:车体大小、颜色、轮胎、方向盘、品牌、速度、排气量,由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。一般静态的面向对象编程语言,继承属于静态的,意即子类别的行为在编译期就已经决定,无法在执行期扩充。
本段内容来源于网络,详细请看“什么是继承”。
多态是指为不同数据类型的实体提供统一的接口,我目前对多态的了解并不多,以我目前的理解,多态打一个不恰当的比喻就像我们身上的每个人身上的性格或特征,当想表达某个人的特征就直呼他的大名,这名字就可以表达这个人,名字就像是了解这个人性格特征的接口。(目前接触多态这个特征不多,所以对这个名词的解释比较模糊)。下面就是网络上对这个名词的解释:
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。
多态可分为变量多态与函数多态。变量多态是指:基类型的变量(对于C++是引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。函数多态是指,相同的函数调用界面(函数名与实参表),传送给一个对象变量,可以有不同的行为,这视该对象变量所指向的对象类型而定。因此,变量多态是函数多态的基础。
多态还可分为:
动态多态(dynamic polymorphism):通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态。
静态多态(static polymorphism):模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。可以用来实现类型安全、运行高效的同质对象集合操作。C++TL不采用动态多态来实现就是个例子。
函数重载(Function Overloading)
运算符重载(Operator Overloading)
带变量的宏多态(macro polymorphism)
非参数化多态或译作特设多态(Ad-hoc polymorphism):
参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程。
对于C++语言,带变量的宏和函数重载(function overload)机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上并不将这种函数多态(function polymorphism)、宏多态(macro polymorphism)展现出来的行为称为多态(或静态多态),否则就连C语言也具有宏多态了。谈及多态时,默认就是指动态多态,而静态多态则是指基于模板的多态。
本段内容来源于网络,详细请看"什么是多态"。
类名 对象名=new 类名();//无形参
例如:Student stu = new Student();//创建Student类的对象stu
类名 对象名=new 类名(参数);//有形参
例如:Scanner sc = new Scanner(System.in);//创建Scanner类对象sc,输入方法
(1)OOA(Object-Oriented Analysis):面向对象分析。
(2)OOD(Object-Oriented Design):面向对象设计。
(3)OOP(Object-Oriented Programming):面向对象编程。
//计算圆锥体积
class Circle{//创建Circle类
double radius,area;//定义创建Circle类半径和底面积
void setRadius(double r){
radius = r;
}
double getRadius(){
return radius;
}
double getArea(){//创建底面积方法
area = 3.14*radius*radius;//派乘r的平方
return area;
}
}
class Height{//创建Height类
double height;//定义高
void setHeight(double h){
height = h;
}
double getHeight(){//接收高
return height;
}
}
class Circular{//创建Circular类
Circle bottom;
Height high;//定义高
void setHigh(Height h){//接收高
high = h;
}
void setBottom(Circle c){//接收底面
bottom = c;
}
void getVolme(){//创建体积方法
double volme;
if(high == null){//如果没有高
System.out.println("没有高!!");
}
if(bottom == null){//如果没有底面
System.out.println("没有底!!");
}
else{
volme = bottom.getArea()*high.getHeight()/3.0;//三分之一底面积乘高
System.out.println("圆锥的体积为:" + volme);
}
}
double getBottomRadius(){
return bottom.getRadius();
}
public void setBottomRadius(double r){
bottom.setRadius(r);
}
double getHeightHigh(){
return high.getHeight();
}
public void setHeightHigh(double h){
high.setHeight(h);
}
}
public class Experiment04{
public static void main(String[] args){
Circle circle = new Circle();//创建Circle类底面圆的对象
circle.setRadius(3.0);
Height height = new Height();//创建Height类高的对象
height.setHeight(3.0);
Circular circular = new Circular();//创建Circular类圆锥的对象
circular.setHigh(height);
circular.setBottom(circle);
circular.getVolme();
}
}
//计算圆锥体积
import java.util.Scanner;
class Circle{//创建Circle类
double radius,area;//定义创建Circle类半径和底面积
void setRadius(double r){
radius = r;
}
double getRadius(){
return radius;
}
double getArea(){//创建底面积方法
area = 3.14*radius*radius;//派乘r的平方
return area;
}
}
class Height{//创建Height类
double height;//定义高
void setHeight(double h){
height = h;
}
double getHeight(){//接收高
return height;
}
}
class Circular{//创建Circular类
Circle bottom;
Height high;//定义高
void setHigh(Height h){//接收高
high = h;
}
void setBottom(Circle c){//接收底面
bottom = c;
}
void getVolme(){//创建体积方法
double volme;
/*
if(high == null){//如果没有高
System.out.println("没有高!!");
}
if(bottom == null){//如果没有底面
System.out.println("没有底!!");
}
*/
//else{
volme = bottom.getArea()*high.getHeight()/3.0;//三分之一底面积乘高
System.out.println("圆锥的体积为:" + volme);
//}
}
double getBottomRadius(){
return bottom.getRadius();
}
public void setBottomRadius(double r){
bottom.setRadius(r);
}
double getHeightHigh(){
return high.getHeight();
}
public void setHeightHigh(double h){
high.setHeight(h);
}
}
/*
class Judge{
Height gao;
void setGao(Height h){
gao = h;
}
double getGao(){
if(gao == null){
return -2;
}
else{
Height he = new Height();
return he.getHeight();
}
}
double getGaoHeight(){
return gao.getHeight();
}
public void setGaoHeight(double r){
gao.setHeight(r);
}
}
*/
public class Experiment04{
public static void main(String[] args){
Scanner ab = new Scanner(System.in);
System.out.println("请输入底面半径:");
double n = ab.nextDouble();
Circle circle = new Circle();//创建Circle类底面的对象
circle.setRadius(n);
Scanner bc = new Scanner(System.in);
System.out.println("请输入圆锥的高:");
double m = bc.nextDouble();
Height height = new Height();//创建Height类高的对象
height.setHeight(m);
Circular circular = new Circular();//创建Circular类圆锥的对象
circular.setHigh(height);
circular.setBottom(circle);
circular.getVolme();
}
}
分开来计算,每个类有每个类的任务。在这个程序中,Circle类接收半径radius,计算底面积area;Height类接收高height;Circular类接收来自Circle类的底面积area、来自Height类的高height、计算体积Volme;main方法主类应用以上的类Circle类、Height类、Circular类。从程序来看,main方法主函数就是家庭里地位最高的,让上面其他的普通类的对象帮他端茶倒水,最后坐着得到自己想要的东西。
(1)不含Scanner的程序结果
(2)含Scanner的程序结果
面向对象算是Java程序设计基础的第一个瓶颈,是一个难点中的难点,同时也是一个重点中的重点,在随后的方法重载、方法覆盖、封装、继承等面向对象都起到很大的基础打底作用,面向对象就是一个地基。
参考文章:https://baike.baidu.com/item/%E5%A4%9A%E6%80%81/2282489
https://baike.baidu.com/item/%E7%BB%A7%E6%89%BF/20267560?fr=aladdin
https://baike.baidu.com/item/%E5%B0%81%E8%A3%85/2796965?fr=aladdin
https://baike.baidu.com/item/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/2262089?fr=aladdin