热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

全方位讲解Java的面向对象编程思想

这篇文章主要介绍了Java的面相对象编程思想,包括类对象方法和封装继承多态等各个方面的OOP基本要素,非常推荐,需要的朋友可以参考下

什么是面向对象?
Object 对象,Oriendted 以…为导向的, Programming 程序设计

面向对象就是使用对象进行程序设计,简写成OOP。

2016130175657163.gif (684×415)

SP和OOP对比

2016130175721344.png (701×461)

面向对象的三大原则
     封装  继承   多态

对象

对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为;
对象其实就是“数据”和“函数”的封装体,其中:
数据表示自身的状态,也称作“属性”或“成员数据”;
函数表示自身的功能,也称作“方法”或“成员函数”。


人们为了更好地认识世界,将现实生活中的事物(对象)划分成类;
同一类中的事物总是具有一些共性;
类以共同的特性和行为定义实体;
类是具有相同属性和和行为的一组对象的集合。

属性
事物的特性在类中用变量表示;
每个对象的每个属性都拥有其特定的值;
属性名称由类的所有对象共享;
对象或实体拥有的特征在类中表示时称为属性     

2016130175744604.gif (545×213)

方法
事物的行为和动作在类中用函数表示;
每个对象都有相同的动作和行为;
对象执行的操作在类中表示为方法。

2016130175800960.gif (546×218)

类和对象的区别
类是用来描述实体的“模板”或“原型”;
对象是实际的实体,每一个对象都是类的一个具体实例;
类用来定义对象所有的属性和方法,同一类的所有对象都拥有相同的特征和操作;
可以将类理解成生产产品的模具,而对象则是根据此模具生产的一个个产品。

类与结构

2016130175817170.gif (620×389)

封装
将某些东西包装在一起,然后以新的完整形式呈现出来;
隐藏属性、方法或实现细节的处理方式称为封装;
封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的安全性问题。

2016130175835633.gif (608×265)

继承
继承就是重用现有的类来生成新类的一种特征;
通俗地讲就是从现有的类(即父类或基类)创建新类(子类或派生类)的过程;
现实生活中,继承可以达到财产重用的目的,而在Java中,继承可以使代码重用。

多态
多态是指同一函数在不同的类中有不同的实现;
多态的好处就是使类更灵活,更便于扩充。

这里还有一个不得不说的的 “抽象”
抽象
把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法;
抽象的基本原则:
只关心主要问题,而不关心次要问题;
只关心主要矛盾,而不关心次要矛盾;
只关心相同的东西,而不关心不同的东西;
只关心问题是什么,能够完成什么,而不关心怎样去完成。
抽象的过程其实就是面向对象编程的核心思想。


在Java中定义类

2016130175854501.gif (656×418)

在Java中创建对象

2016130175911018.gif (654×417)

创建对象的语法
和数组相似,对象也是引用数据类型,只能使用new运算符从堆中分配内存;
创建对象的一般语法:
  类名 引用名 = new 类名();
使用已经定义好的类,创建该类对象的过程称为“实例化”。

成员运算符  “ . ”
只有先实例化类的对象,才可以访问到类中的成员(属性和方法);
使用成员运算符(.)来访问成员属性或成员方法;
一般语法是:
  对象名.成员名
如:

std.age = 18;  //为成员属性赋值
  std.dining(); //调用成员方法

访问权限:public和private
C语言中结构体的成员可以从任何地方进行访问,这将给数据的安全留下极大的隐患;
为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;
关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问;
public修饰的成员可以在任何地方进行访问,不受任何约束;
private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。

无法从类的外部访问私有成员;
其它类的私有成员对于当前类也是隐藏的。

2016130175929736.gif (418×269)

访问权限示例

class Student { 
 private String name;  //姓名,私有的,不可以从类外部直接访问 
 private int age;    //年龄,私有的,不可以从类外部直接访问 
 private float weight; //体重,私有的,不可以从类外部直接访问 
  
 //吃饭的方法,公有的,可以从任何地方访问 
 public void dining() { 
  System.out.println("吃饱了..."); 
  weight++; //dining方法是类内部成员,可以直接访问本类私有成员 
 } 
  
 //走路的方法,公有的,可以从任何地方访问 
 public void walk() { 
  System.out.println("走累了..."); 
  weight--; //walk方法是类内部成员,可以直接访问本类私有成员 
 } 
} 
 
public class Test { 
 public static void main(String[] args) { 
  Student std = new Student(); //实例化一个Student对象 
  std.age = 18;  //试图从类外部访问私有成员,将会报出一个错误 
  std.dining();  //允许访问公有成员 
 } 
} 


访问权限(续)
加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全;
一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的;
有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏;
因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public。
如:修改Student类

class Student { //定义学生类 
 private String name;  //姓名,私有 
 private int age;    //年龄,私有 
 private float weight; //体重,私有 
 
 public void setName(String name) {  //为姓名赋值的方法,公有 
  this.name = name; 
 } 
 public void setAge(int a) {    //为年龄赋值的方法,公有 
  age = a; 
 } 
 public void setWeight(float w) { //为体重赋值的方法,公有 
  weight = w; 
 } 
 public void display() {      //将所有信息打印出来的方法,公有 
  System.out.println("姓名:" + name + ",年龄:" + age + ",体重:" + weight); 
 } 
 public void dining() {……}     //吃饭的方法,公有,代码略 
 public void walk() {……}      //走路的方法,公有,代码略 
} 
 
public class Test { 
 public static void main(String[] args) { 
  Student std = new Student(); //实例化学生类对象 
  std.setName("张三");      //为姓名赋值 
  std.setAge(18);        //为年龄赋值 
  std.setWeight(55);      //为体重赋值 
  std.dining();         //调用吃饭的方法 
  std.display();        //将信息打印出来 
 } 
} 

对象初始化
在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员属性,就使用到了构造方法;
构造方法是特殊的成员方法,它与类同名,在对象实例化时由虚拟机自动调用;
请注意:构造方法没有返回值类型,也不能有返回值。
构造方法示例:

/*定义ConstructorDemo类,对构造方法进行测试*/ 
class ConstructorDemo 
{ 
 /*构造方法,方法名与类名完全一致 
 无需指定返回值类型,也不能有返回值*/ 
 public ConstructorDemo() 
 { 
  System.out.println("这是构造方法"); 
 } 
} 
 
/*Test类,用来容纳main方法 
一般将包含有main方法的类声明为public*/ 
public class Test 
{ 
 /*main方法,程序入口*/ 
 public static void main(String[] args) 
 { 
  /*实例化ConstructorDemo类的对象*/ 
  ConstructorDemo cd = new ConstructorDemo(); 
 } 
}    //会输出“这是构造方法” 

构造方法
正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给数据成员分配资源或初始化数据成员;
构造方法的一般形式:
  访问权限 类名(形参列表) {
    方法体
  }
因为是由虚拟机来调用构造方法,所以构造方法一般应定义成public。

如:为Student类添加构造方法

class Student { //定义学生类 
 private String name;  //姓名,私有 
 private int age;    //年龄,私有 
 private float weight; //体重,私有 
 
 //构造方法,根据传递进来的参数,为数据成员赋值 
 public Student(String n, int a, float w) { 
  //分别为每个数据成员赋初始值 
  name = n; 
  age = a; 
  weight = w; 
 } 
 public void setName(String n) {……} //为姓名赋值的方法,公有,代码略 
 public void setAge(int a) {……}   //为年龄赋值的方法,公有,代码略 
 public void setWeight(float w) {……} //为体重赋值的方法,公有,代码略 
 public void display() {……}  //将所有信息打印出来的方法,公有,代码略 
 public void dining() {……}  //吃饭的方法,公有,代码略 
 public void walk() {……}   //走路的方法,公有,代码略 
} 
 
public class Test { 
 public static void main(String[] args) { 
  //利用构造方法,为数据成员指定初始值 
  Student std = new Student("张三", 18, 55); 
  std.display();        //将信息打印出来 
 } 
}  


构造方法(续)
每个对象在生成时都必须执行构造方法,而且只能执行一次;
如果构造方法调用失败,那么对象也无法创建;
不可以显式地直接调用构造方法;
在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个默认的构造方法什么都不做;
一旦显式地定义了构造方法,默认构造方法自动消失。故一般定义无参和有参两个构造方法。

总结

  • 对象由状态(属性)和行为(方法)组成;
  • 类是具有相同属性和方法的对象的集合;
  • 封装可以隐藏对象实现的具体细节;
  • 必须先实例化类的对象,才可以访问到其中的成员;
  • 成员运算符用于访问对象的成员;
  • 成员可以定义为公有,也可以定义为私有;
  • 构造方法一般用来初始化对象中的数据成员;
  • 如果不定义构造方法,将有默认的构造方法,一旦定义,默认的构造方法自动消失。

推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
author-avatar
null
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有