面向对象在软件开发各个方面的应用:
OOA(Object Oriented Analysis):面向对象分析
在软件开发的过程中,面对一个新的项目启动时,第一件事情就是项目需求分析,把项目的方方面面,包括数据以及数据之间的关系都转换为对象,以及对象之间的联系。
OOD(Object Oriented Design):面向对象设计
把分析阶段得到的需求转换成符合成本和质量要求的系统实现方案,也就是说确定数系统需要哪些类,类中需要哪些属性和方法,类之间的关联等等。
OOP(Object Oriented Programming):面向对象的编程
就是把设计出来的类用代码实现。
面向对象最大的特点就是,程序研发人员可以根据具体的问题,设计出任何需要的类,用来解决问题。面向对象它是一种开发的思想,一种思考问题,分析问题,解决问题的方式,所以学习面向对象不是一天两天的事情,要多做练习去理解思想。
面向对象是java的核心思想,面向对象的三大特征:封装、继承、多态和抽象。
封装:
- 概念:面向对象的封装可以把对象的属性和方法组合在一起,统一提供对外的访问权限,封装就是将对象的使用者和设计者分开,设计者可以设计出外部可以操作的内容和只能内部操作的内容。使用者只能使用设计好的内容,却看不见设计者是如何实现的。就像计算机是由cpu、内存和各种外设组成的,对于计算机的用户来说,只能使用这些部件,但是却看不见这些部件的内部结构。
- 好处:在程序设计中,类把数据和方法封装到一起,对数据和方法的操作起到了保护的作用。
- 修饰符:开发人员在进行封装的时候,需要借助于一下的修饰符来控制对属性和方法的访问:
- public:表示公共的,用public修饰的属性和方法,其他任何的类都可以去访问,这是最开放的权限。
- private:表示私有的,用private修饰的属性和方法,只能在当前类中使用,其他类中没有办法使用。
- protected:表示受保护的,用protected修饰的属性和方法,可以在本包中的所有类中可以使用,并且可以在非本包的子类中可以是使用。
- 缺省的:就是方法和属性面前没有任何的修饰符,缺省修饰符的属性和方法可以在同包中的其他类进行访问,不允许其他包中的类,包括子类进行访问。
package com.bxit; public class Person { //定义属性 private String name; private boolean sex; private int age; private String hobby; //定义公共的方法 public void display(){ //..... } //定义一个私有的方法 private String getSex(){ return sex?"女":"男"; } //定义一个受保护的方法 protected void study(){ //..... } //定义一个缺省的方法 void filter(){ //..... } } |
修饰符的权限表:
内容 | public | protected | 缺省 | private |
同类访问 | √ | √ | √ | √ |
同包其他类访问 | √ | √ | √ | × |
同包子类访问 | √ | √ | √ | × |
不同包子类访问 | √ | √ | × | × |
不同包非子类访问 | √ | × | × | × |
注意:
1.一般情况下,属性一般用private修饰,为了private修饰的属性能被外部访问。通常为属性定义一组get/set方法,称为属性的访问器。
2.如果属性只有get方法,没有set方法,称为只读属性;如果属性只有set方法,没有get方法称为只写属性。
例如:
private String name; private String hobby; private int age; private String classes; private boolean sex; //访问接口get/set方法 //name的get方法 命名规则 get+(属性名首字母大写) public String getName(){ return this.name; } //name的set方法 命名规则 set+(属性名首字母大写) public void setName(String name){ this.name=name; } public int getAge() { return age; } //可以在方法中对输入的内容进行限制 public void setAge(int age) { if(age>=0&&age<200){ this.age = age; }else{ System.out.println("年龄有误!"); this.age=200; } } public String getClasses() { return classes; } public void setClasses(String classes) { this.classes = classes; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public String getHobby(){ return hobby; } public void setHobby(String hobby){ this.hobby=hobby; } |
(重要)方法的重载:
- 概念:在同一个类中一个方法的名称可以定义很多歌方法,只要参数不同即可,这叫做方法的重载。
- 好处:1.加强方法的灵活性
2.有利于方法调用的方便性。
例如:编写一个加法
解析:基本的数据类型中能够参与运算的就有7个,就算有数据类型的兼容性的情况,为了要考虑程序使用的方便灵活性,要考虑三种类型:int、long、double,因此两个数相加至少需要写三个方法才能够满足,代码如下:
package com.bxit; /** * 方法的重载 * @author QJ * */ public class Sum { /** * 在一个类中可以有很多重名的普通的方法,叫做方法的重载。 * 条件:1.参数列表必须不一致 * (1).参数的数量不一样 * (2).参数的类型不一样 * (3).在参数相同的方法中,每一位上对应的数据类型不能一样 * 2. 方法名称必须一样 * 3.方法的重载和方法的返回类型没有一点关系,和方法的修饰符也没有关系 * 好处:1.加强程序的灵活性 */ //计算两个整数相加 public int add(int a,int b){ return a+b; } /*public double add(int a,int b){ return a+b; }*/ public double add(double a,double b){ return a+b; } /*public double add(double a,int b){ return (a+b); }*/ public long add(long a,long b){ return a+b; } } |
方法重载的条件:
- 方法名称相同
- 方法的参数不同,其中方法的参数不同包括:
- .方法的参数数量不同。
- 方法的参数的类型不同。
- 相同数量的参数中,不同参数类型在方法参数列表中的顺序不同。
注意:方法重载与方法的返回值类型和方法的修饰符没有任何关系,与参数列表中的参 数名称也没有任何的关系。
下一讲:面向对象继承