一.面向过程和面向对象
面向过程(pop)和面向对象(oop)都是语言设计思想(宏观上)。
1.1面向过程语言
面向过程(pop):过程就是操作数据的步骤,如果过程中出现大量冗余的代码那么就把这些代码包装起来形成函数,这样就可以大大减少冗余,便于维护。
典型语言:C语言
代码结构:以函数为组织单位。
2.1面向对象语言
面向对象(oop):关注的焦点是“ 类 ”,面向对应设计程序时,从宏观上分析程序有哪些功能,然后对功能进行分类封装,把不同的功能封装在不同的类(eg:造汽车,发动机,轮胎等)中,是一种宏观设计,但到具体实现时,仍然离不开面向过程。
典型语言:Java,C#,C++,Python,Ruby,PHP等
代码结构:以“类”为组织单位,每个事物都具备自己的属性,行为和功能。是一种设计者思维,适合解决复杂问题,代码扩展性强,可维护性高。
二.类和对象(面向对象的的核心概念)
类:是具有相同特征(同一类)事物的抽象描述。(eg:人类,汽车类,动物类等等)
类的结构:①变量:事物属性的描述(名词)
②方法:事物的行为(动词)
③构造方法(初始化对象,给对象赋初值)
④块:一段没有名称的代码块
⑤内部类:即在类的内部再声明类。
对象:是类的一个具体实例,是实际存在的,可以使用的。(eg:张三,宝马,猫等)
三.如何创建对象?
使用new关键字。
下面是个汽车类的例子:
//汽车类
class Car{
String name;
String color;
public void Run(){
System.out.println("汽车在马路上行驶");
}
public void Stop(){
System.out.println("汽车停止");
}
}
这里是测试类(主类):
public class TestCar {
public static void main(String[] args) {
Car c1=new Car();//这里用new创建了一个对象 ,并用c1来接收
//就可以通过c1对象去给变量赋值或调用Car类中的方法
c1.name="宝马";
c1.color="黑色";
c1.Run();
c1.Stop();
}
成员变量在类中定义时,可以不给其赋初值,系统会自动初始化赋相应类型的默认值。
四.构造方法
构造方法名与类名相同,且没有返回值,不需要void修饰。
构造方法分为:无参构造方法和有参构造方法
作用:在构造方法中为创建的对象成员变量初始化赋值。
特点:每个类都有构造方法,如果在类没有写出构造方法,Java会默认类中有无参构造,且在无参构造方法中赋的初值是默认值,但是,如果类中已经写出有参的构造方法,Java所提供的无参构造就不存在了,想要再次使用无参构造方法就必须在类中重新写出无参构造方法便可再次使用。
//无参构造
public Car(){
}
//有参构造
public Car(String n,String c,int m){
money=n;
color=c;
money=m;
}
public class Car{
public Car(){ }
public Car(String name){ // 这个构造方法有一个参数:name }
}
例:创建Car类的对象
Car car1 = new Car();
Car car2 = new Car(“宝马”)
五.方法的重载
方法的重载:指在一个类中,可以存在多个名称相同的方法。
这些重载的方法通过方法参数的个数,类型,顺序来区分。
注意:方法的重载和方法的返回值没有任何的关系。
---构造方法和成员方法都可以实现方法的重载。
构造方法的重载
public max(){
}
public max(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
public max(double d,double e,double f){
this.d=d;
this.e=e;
this.f=f;
}
//方法的重载
public int max(int a,int b){
int max=a>b?a:b;
return max;
}
public double max(double a,double b){
double max=a>b?a:b;
return max;
}
public int max(int a,int b,int c){
int max=(a>b)?(a>c?a:c):(b>c?b:c);
return max;
}
public double max(double a,double b,double c){
double max=(a>b)?(a>c?a:c):(b>c?b:c);
return max;
}
六.对象和引用
Java语言中除了8种基本类型之外的都属于引用类型。
Java中的对象是通过引用对其操作的。
类和对象的内存结构图如下:
Java虚拟机运行内存空间包括三部分,栈(主要加载运行方法,首先进栈的肯定是main方法)堆(主要用来存储创建出来的对象) 方法区(主要存储类的信息)。
在main方法中去new一个引用类型的变量时,就会在堆中创建了一个人对象空间,用一个地址去记录这个空间,主方法中new的对象其实赋给的是这个对象空间的地址。
下面给出两个例子:
int a=10;
int b=a;
b=20;
System.out.println(a);
System.out.println(b);
//上述代码的结果为:a=10;b=20;这就是基本类型的赋值情况。
Person p1=new Person();
p1.name="张三";
Person p2=p1; //1001,假设的地址值
p2.name="李四";
System.out.println(p1.name);
System.out.println(p2.name);
//最终结果都是李四,因为new为p1创建了个地址块,p1只是接收了地址块的地址,其块内有name属性,p1.name调用name="张三"。p1把地址值赋给p2,p2和p1访问了同一个地址块,地址块的name属性又赋值成"李四",故都输出"李四"