面向对象特点
1、是一种符合人们思考习惯的思想。
2、将复杂的问题简单化。
3、使程序员从动作的执行者变为动作的指挥者。
4、完成指定的需求时:
先去找具有所需功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。
这样简化了开发并且提高了复用性。
面向对象开发、设计、过程
开发过程:其实就是不断的创建对象、调用对象、指挥对象做事情。
设计过程:其实就是在管理和维护对象与对象之间的关系。
面向对象的特性:
继承、封装、多态、抽象也算
总结
为什么面向对象会如此流行?业界关于这个谈论的最多的是以下几点:
- 它能够非常好地进行代码复用
- 它能够非常方便地应对复杂代码
- 在进行程序设计时,面向对象更加符合程序员的直觉
第一点,在理论上确实成立,但实际往往却是在面向对象的大背景下,写一段便于复用的代码比面向过程背景下难多了。
第二点,你不觉得正是面向对象,才把工程变复杂的么?如果层次清晰,调用规范,无论面向对象还是面向过程,处理复杂业务都是一样好,等真的到了非常复杂的时候,对象间错综复杂的关系只会让你处理起来更加头疼,不如面向过程来得简洁。
第三点,这其实是一个障眼法,因为无论面向什么的设计,最终落实下来,还是要面向过程的,面向对象只是在处理调用关系时符合直觉,在架构设计时,理清需求是第一步,理清调用关系是第二步,理清实现过程是第三步。面向对象让你在第二步时就产生了设计完成的错觉,只有再往下落地到实现过程的时候,你才会发现第二步中都有哪些错误。
面向对象三大特征:封装、继承、多态
顾名思义,封:封闭,装:装起来,将具体的实现细节装到一个容器中,并封闭起来,防止容器外部直接访问容器内部的实现细节,仅公开暴露指定的访问路径;生活中的例子:到饭馆吃饭,你只需要跟服务员讲你要吃什么饭菜,服务员就会跟后台厨房的厨师说明一下,等待一段时间后,饭菜就被服务员直接递送到你面前,作为客户的你是不知道也无需知道饭菜的具体做法,后台厨房的厨师及做饭菜的过程就是被封装的细节,而服务员则是公开暴露的访问路径,你只能通过服务员点餐然后获得饭菜,而不能直接去到后台厨房要求厨师如何做饭菜;
封装的好处: 1. 隔离性。 被封装后的对象(这里的对象是泛指代码的编程单元,一般指:程序集,命名空间,类,方法,属性,变量等)其外部对象是无法直接访问对象的内部实现细节,内部实现细节的的改动不会影响到外部对象的访问原则(即:对象内部修改后,在公开暴露指定的访问路径不变的情况下,外部访问它的对象是无需修改的),这是隔离性的体现,同时也是实现高内聚,低耦合的最根本的思想之一; 2. 可复用性。 被封装后的对象可以被外部多个对象访问,而无需为每个外部对象去指定不同的服务对象;如:所有的对象的基类都是object类,object类里面的公共成员可以被其所有子类使用,Ado.Net相关的数据访问类及其公共成员均可被其它所有的对象使用等。 3. 可读性。 被封装后的对象的名称(如:程序集名,类名,方法名)如果命名恰当,那么就能在不看里面的实现细节的前提下,了解该对象的作用;如:DataTable就是用来装表格数据的;ToString就是转换为字符串,Length就是指长度等。
封装的步骤:
- 封装的目的:保护类内属性,不允许随便修改。
- 权限修饰符:控制变量、函数等的权限范围
- public : 公共的,谁都可以访问;
- private : 私有的,只有类内访问的权限;
封装一定要提供 set 和 get 的方法吗? 答: 不一定,根据需求而定。规范 : 在现实开发中一般实体类的所有成员属性(成员变量)都要封装起来。(实体类:实体类就是用于描述一类 事物的就称作为实体类。与实体类相反的就是工具类【Arrays数组】) 封装是不是会使得编码变得复杂和工作辆很大:2*成员变量? 答:eclipse 会解决这个问题,快捷键就可以搞定! 在使用eclipse写java程序中 同时按shift+Alt+s 选择Generate Getters and setters , 可以自动的写出set\get的方法 项目是由多个人去写的,所以大家做的都是封装、继承、多态!!!然后集成!!!大家是按照模块开发的。
小练习1:
/*
* 1 一个java文件中可以有多了class ,但是只能有一个main函数
* 定义一个类
*/
class Car { String name;
String color;
int wheel; public void run() {
if (wheel >= 4) {
System.out.println(name+"..."+"run ...");
} else {
System.out.println("need to repair ...");
} }}class CarFactory {
String name;
String address;
int tel; //public Car repairfun(Car c) { // 需要返回值的
public void repairfun(Car c) {
if (c.wheel >4) {
System.out.println("ok...run.... ");
//Thread.sleep(1000);
}
else {
c.wheel =4;
System.out.println("ok...run.... ");
}
//return c;
}
}public class ct_class { public static void main(String[] args) {
// TODO Auto-generated method stub
Car car1 = new Car(); // 使用car类声明了一个car1对象,car1对象指向了一个车对象
// System.out.println(car1.name); // 一般初始化就是null
car1.name = "BMW";
car1.wheel=4;
for (int i = 0; i < 100; i++) {
car1.run();
}
car1.wheel=3;
car1.run();
CarFactory carFactory= new CarFactory();
//car1=carFactory.repairfun(car1); // 对应返回值
carFactory.repairfun(car1); // 没有返回值
car1.run();
}
}
小练习2:
class Person{
/* 没有封装的版本
String name ;
String sex;
int age ;
void eat(Person person)
{
System.out.println("eat...");
}
*/
private String name ;
private String sex; // 封装 ------ 定义一个公共的方法设置sex属性
public void setSex(String s) {
if (s.equals("man") || s.equals("woman")) { // 注意: 如果比较两个字符串的内容是否一致,不要使用==比较,
// 使用equals方法。
sex = s;
} else {
// 默认是男
sex = "null";
}
} // 定义一个公共的方法获取sex属性
public String getSex() {
return sex;
}
private int age ;
private void eat(Person person)
{
System.out.println("eat...");
}
}
public class encapsulation { public static void main(String[] args) {
// TODO Auto-generated method stub
/* 没有封装的版本
Person person1 = new Person();
person1.age= 10; // 对应情况 int age ;
person1.name="DD"; // String name ;
System.out.println(person1.name+" "+person1.age);
person1.eat(person1);
*/
Person person1 = new Person();
person1.setSex("man");
System.out.println("性别:"+person1.getSex());
person1.setSex("men");
System.out.println("性别:"+person1.getSex());
}}
小练习3:
class Car{
private String name;
private String address;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the address
*/
public String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(String address) {
this.address = address;
}
}