面向对象
面向对象与面向过程的区别
面向过程
面向过程是以过程为中心的思想,这些都是以什么正在发生为主要目标进行编程。
简单来说,就是分析要解决的问题所需要解决的步骤,然后一个一个写出功能函数并依次调用,举个例子:比如说我们想做一份炸薯条 我们就要做如下的步骤
0、我们要够买所需的食材。
1、首先将土豆削皮,泡水后切条状,将土豆条泡水防止氧化。
2、锅中坐水,水开后放入土豆条焯两分钟,捞出过凉水。
3、沥干水分后放入保鲜袋中,放入冰箱冷藏。
4、锅中倒油,放入土豆条炸至浅金黄,复炸,炸至表面金黄捞出装盘,配上番茄酱。
5、美味的薯条就完成了。(这里的每个步骤都是我们亲自参与)
面向对象
面向对象 就是把我们需要的功能封装到一个类里,在我们需要时通过对象调用功能模块。
当面向封装了具体功能类,若要使用这个类,一般情况下,在Java中需要通过创建这个类的实体来使用。这个实体称之为对象。
在开发中,我们是在不断的找封装不同功能的类。基于这些类,创建其对象,使用这些对象完成相应的操作。
举个例子:还是上面的炸薯条
我直接点个外卖,或者直接在店里买,它不香吗?(我们其实调用了有会做出薯条功能的店员对象,和有帮我们取薯条功能的外卖员对象)
通过上面的讲解和分析得出:面向对象是基于面向过程,对象是将功能进行了封装。
只要找到了具体的类,创建出对象,就可以调用其中的具体功能。
面向对象也是用来解决问题的一种思维模式。 在以后开发中,先找对象,调用对象中的具体功能。如果真的没有能够完成需求的对象,这时就自己创建对象,并将所需的功能定义到对象中,方便以后使用
比较
项目 | 面向对象程序设计 | 面向过程设计(结构化设计) |
特点 | 封装,继承,多态 | 算法+数据结构 |
优点 | 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 | 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 |
缺点 | 性能比面向对象低 | 没有面向对象易维护、易复用、易扩展 |
设计 语言 | Java、Smalltalk、EIFFEL、C++、Objective-、C#、Python等 | C、Fortran |
类和对象
类
- 是 一种共性的特征,是一种抽象的概念集合在类中定义的是属性和行为(方法)。
属性:一个人的静态特征,例如:身高,体重……
方法:一个人懂的动态行为,例如:吃饭,洗澡,睡觉……
- 类必须编写在.java文件中。
- 内部类才可以被声明为静态类。
- .java文件的文件名必须与public修饰的类名完全一致。
- 一个.java文件中,可以存在多个类,但是只能存在一个public修饰的类。
对象
- 对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。(书本,学生,动物……)
- 在面向对象程序设计(OOP)中,对象所指的是计算机系统中的某一个成分。
- 在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。
- 对象则是数据和动作的结合体。
- 对象不仅能够进行操作,同时还能够及时记录下操作结果。
类和对象的区别
类和对象的区别:类是对象的抽象,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
定义类与对象
定义类 我们要用class关键字
class 类名称 {
属性 (变量) ;
行为 (方法) ;
}
对象的声明方式;
// 声明的同时并实例化对象
类名称 对象名称 = new 类名称 () ;
// 先声明对象 再实例化
类名称 对象名称 = null ;
对象名称 = new 类名称 () ;
因为类是引用数据类型: 引用数据类型需要内存空间的分配和使用。
关键字new :分配内存空间
对象的属性和方法的调用
对象的属性赋值
对象名称.属性名称 = 值;
如果访问属性的值
对象名称.属性名称
调用对象的方法
对象名称.方法名称([参数列表]);
案例1
public class Person {
//属性
String name;
int age;
boolean gender;
String email;
String telphone;
double height;
float weight;
//行为
public void speak() {
System.out.println("hello world");
System.err.println("我的名字"+name+"年龄" + age);
}
public static void main(String[] args) {
//创建对象
Person p = new Person();
//为对象进行属性赋值
p.name = "日向翔太";
p.age = 16;
p.gender=false;
p.email="120@qq.com";
p.telphone = "120";
p.height= 165;
p.weight= 110;
// 调用对象的方法
p.speak();
}
}
案例2:求圆与三角形的面积与周长
import java.util.*;
public class TestS1 {
public static class Circle{
//为该类提供一个变量r表示半径,一个常量PI表示圆周率
public double r;
public final double PI = 3.14;
//方法一用于求圆的面积
public void area() {
System.out.println("");
System.out.println("圆的面积为:" + PI * r * r);
}
//方法二用于求圆的周长
public void girth() {
System.out.println("");
System.out.println("圆的周长为:" + 2 * PI * r);
}
}
public static class Strange{
double a, b, c;
public double area() {
double p = (a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
public double girth() {
return a+b+c;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入圆的半径 ");
double r = sc.nextDouble();
Circle c = new Circle();
c.r=r;
c.area();
c.girth();
Strange str = new Strange();
System.out.println("请输入三角形的三边 ");
str.a = sc.nextDouble();
str.b = sc.nextDouble();
str.c = sc.nextDouble();
System.out.println("三角形的面积 " + str.area());
System.out.println("三角形的周长 " + str.girth());
}
}
案例3:两点之间的距离
public class Point {
public int x;
public int y;
// 求两点间的距离
public double getDistance(Point p2) {
return Math.sqrt((x - p2.x) * (x - p2.x) + Math.pow((y - p2.y), 2));
}
public static void main(String[] args) {
Point p1 = new Point();
p1.x = 3;
p1.y = 3;
Point p2= new Point();
p2.x = 0;
p2.y = 7;
System.out.println(p1.getDistance(p2));
}
这里使用 对象名称.方法名称([参数列表]);的方式,参数列表里是p2这个对象
UML统一建模语言
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言
分类:用例图 ,类图,对象圈,活动图,状态图,序列图,协作,构件图,部署(配置图)
类图
- 专业术语:
- OO(Oriented Object):面向对象
- OOA(Oriented Object Analysis):面向对象的分析
- OOD(Oriented Object Desgin):面向对象的设计
- OOP(Oriented Object Programming):面向对象的编程
- OOT(Oriented Object Test): 面向对象的测试
对象属性的默认值问题
考虑到C++,因为类属性如果没有赋予初始化,默认值随机!!!
java将对象的属性都给与了默认值
对象的属性的默认值
java中存在默认值:
整数:0
浮点数:0.0
布尔:false
char:''
对象:null
public class User {
public String username;
public int age;
public double weight;
public float height;
public char gender;
public boolean isLive;
public void showInfo() {
System.out.println(username + "--"+ age
+ "---"+ weight + "----"+ height
+"--"+ gender + "---"+ isLive);
}
public static void main(String[] args) {
// 创建了对象
User u1 = new User();
// 第二步:为对象的属性赋值了
u1.username = "张三";
u1.age = 16;
u1.weight = 120;
u1.height = 170;
u1.gender = '男';
u1.isLive = true;
// 打印属性
u1.showInfo();
User ldh = new User();
ldh.showInfo();
}
}
运行结果:
张三--16---120.0----170.0--男---true
null--0---0.0----0.0--