面向过程和面向对象
面向过程(procedure -Oriented Programming),POP
设计思想:面向过程关注的焦点是过程,就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。
典型语言:C语言。
优缺点:是一种“执行者思维” ,适合解决简单问题。分析出解决问题所需要的步骤,然后把步骤一步一步实现。但是扩展能力差、后期维护难度较大。
面向对象( Object Oriented Programming),OOP
设计思想:面向对象关注的焦点的类。在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,用类来表示。
典型语言:Java、C#、C++、python、Ruby和PHP等
优缺点:是一种设计者思维,适合解决复杂问题。代码扩展性强、可维护性高。
两者之间的联系
面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。他们是相辅相成的。面向对象离不开面向过程
面向对象
类和对象
类(Class)和对象(Object)是面向对象的核心概念
类
具有相同特征的事物的抽象描述,是抽象的、概念上的定义。
类的结构
变量:事物属性的描述(名词)
方法:事物的行为(可以做的事情 动词)
构造方法:初始化对象
块:一段没有名称的代码块
内部类:即在类体中声明的类
如何写一个类
第一步:发现类。
例如:各种车,根据不同类型的车,抽象出"车类"。
声明格式为:
[访问权限修饰符] [修饰符] class Car{
}
访问修饰符有两种public,无(默认)
修饰符:final,abstract
关键字class用来定义一个类
第二步:发现类的共有属性(成员变量)
public class Car{ //成员变量定义 String name; //名称 String color; // 颜色 float price;//价格 }
第三步:发现类的共有行为(成员方法)
方法的声明格式为:
访问权限修饰符 修饰符 void start(){
System.out.println("汽车启动");
return 返回值;
}
对象
实际存在的该类事物的每个个体,是具体的,因而也称为实例。
创建并使用对象
Car car= new Car();
Car car:使用Car类作为类型声明一个变量car.
new Car():使用new 创建对象,然后调用Car类的构造方法初始化对象.
= :将右边创建的对象地址赋给左边的car变量
同一类的每个对象有不同存储空间。
总结
类是一类事物的抽象概念,是一个模型. 对象是由这个模型所创造的,一个个具体存在的,实实在在存在的实例. 所以创建对象的过程也叫实例化对象.
现实生活中先有对象后有类,而编程时先设计类后创建对象.
构造方法
定义:构造方法名与类名相同,且没有返回值,且不需要使用void修饰
作用: 在构造方法中为创建的对象成员变量初始化赋值
特点:每个类都有构造方法,如果没有显式地为类定义构造方法,Java将会为该类提供一个默认无参构造方法,但是只要在一个Java类中定义了一个有参构造方法后,默认的无参构造方法会失效。
一个类可以有多个构造方法。
public class Car{ String n; public Car(){ } public Car(String name){ n = name; } }
创建Car类的对象
Car car1 = new Car();
Car car2 = new Car(“宝马”)
方法的重载
定义:方法的重载是指一个类中具有相同的名字,但参数不同的多个方法。
不同之处:参数不同(可以有三方面的不同)
1、参数数量不同
2、参数类型不同
3、参数顺序不同
调用时会根据不同的参数表选择对应的方法。
public void max(int x,int y){
a=x;
b=y;
System.out.println("最大值为:" + (a > b ? a : b));
}
public void max(double x,double y){
a1=x;
b1=y;
System.out.println("最大值为:" + (a1 > b1 ? a1 : b1));
方法重载跟方法的返回值类型没有任何关系
对象与引用
Java 语言中除基本类型之外的变量类型都称之为引用类型。
Java中的对象是通过引用对其操作的
例如我们自定义一个类:
class Car{ String name; String color; float price; } Car car= new Car();
通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作
1)右边的“new Car()”,是以Car类为模板,在堆空间里创建一个Car类对象。
2)左边的“Car car”创建了一个Car类型引用变量。所谓Car类的引用,就是以后可以用来指
向Car对象的对象引用。
3)”=”操作符使对象引用指向刚创建的那个Car对象。
其实是有两个实体:一个是对象引用变量,一个是对象本身。
值传递
形参数类型是基本数据类型,方法调用时,实际把它自己的值传给形式参数,是两个不同的存储单元,所以形参值的改变不影响实参的值。
public class Test1 {
public static void main(String[] args) {
int a = 20;
Test1 test1 = new Test1();
test1.add(a);
System.out.println("a= "+a);
}
public void add(int x){
x = 65;
System.out.println("x="+x);
}
}
引用传递
形参数类型是引用数据类型参数,实际传递的只是地址,实参和形参指向的是同一地址,任何一方改变对象的值,另一方也会改变。
public class Test2 {
String name;
public void set(Test2 t){
t.name = "小黄";
System.out.println("name = "+t.name);
}
public static void main(String[] args) {
Test2 test2 = new Test2();
test2.name = "小黑";
test2.set(test2);
System.out.println("name = "+test2.name);
}
}
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身 。但是无论是值传递还是引用传递,其本质都是传值,所以也都统称值传递.