Java面向对象 类与引用
面向对象
面向过程与面向对象
面向过程和面向对象都是程序设计的一种风格(思想);
面向过程的程序思想(procedure -Oriented Programming),简称POP
- 关注焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取成一个函数,这样就可以大大简化沉余代码,便于维护。
- 是以函数(一个一个的功能)为结构进行代码组织
- 相对于面向对象语言,扩展能力差,后期维护难度较大
面向对象程序思想(Object Oriented Programming),简称OOP
-
关注焦点是类:在计算机程序设计过程中,参照现实中事物,将事物的属性特征,行为特征抽象出来,用类来表示。
-
以类为单位进行组织,每种事物都具备自己的属性和行为/功能类:一类问题/分类 String,Math,Array,Scanner······
-
是一种设计思维,适合解决复杂问题。代码扩展性强,可维护性高
public class 类名{
}
**注:**千万不要把面向过程和面向对象对立起来,他们是相辅相成的。面向对象离不开面向过程!
区别:面向过程适合简单的问题.
面向对象适合复杂的问题,先宏观的分类设计,具体的某一个步骤落地时,有需要面向过程,他们是相辅相成的
类和对象(面向对象的核心概念)
类:
概念:是具有相同特征的事物的抽象描述,是对对象的概括和总结
类的结构
-
变量:事物属性的描述(名词)
-
方法:事物的行为(可以做的事情 动词)
-
构造方法:初始化对象
-
块:没有名字的一个代码块
-
内部类:在类的内部定义的类
类的声明格式 [访问权限修饰符][修饰符]class{ } 访问修饰符有两种public,无(默认) 修饰符:final,abstract 关键字class用来定义一个类 Java类名的命名规范: 类名首字母大写,见名知意,驼峰表示
对象:(Everything is an object)
eg:人类–>一类群体 概念
张三–>具体的人,对象
概念:实际存在的该类事物的每个个体 ,也称为实例;以类为模板在内存中创建的实际存在的实例
- 同一个类的每个对象有不同存储空间
package day5;
import java.sql.SQLOutput;
public class Car {
/*
定义属性 成员变量 直接在类{} 中定义内容,称为类的成员
*/
String name;
String color;
int price;//不需要初始化
/*
定义方法 成员方法
*/
public void run(){
System.out.println("汽车行驶");
}
public void stop(){
System.out.println("汽车停止");
}
}
package day5;
public class TestCar {
public static void main(String[] args) {
Car car=new Car();//
//new这个运算符来创建一个对象。new的结果是一个对象的引用
//new以Car类为模板,块独立的空间在内存中开辟一空间,用来存储对象信息
/*
Car(类型)car(变量名)声明一个Car变量=[把右边的对象地址赋值给左边的变量,用变量在后面的程序中表示内存中的对象]
*/
car.name="宝马";
car.color="黑色";
car.run();
}
}
变量按位置分
成员变量:
- 可以使用基本数据类型,也可以使用引用数据类型.
- java中的变量在使用时必须初始化,成员变量不对其初始化,系统会对其默认初始化为 null或0;
- 成员变量可以在成员方法,构造方法,代码块中使用
局部变量(在方法中定义)
- 系统不会对它自动初始化
类中的成员和成员方法都必须创建出来的对象来调用
类的构造方法
- 定义:构造方法与类名相同,且没有返回值,且不需要void修饰
Car bmcar = new Car();
-
特点:类中没有定义时,会默认有一个无参的构造方法,在无参的构造方法中为成员变量赋初始值;我们还可以定义有参的构造方法,通过有参构造方法为成员变量赋初值
一旦类中定义了有参的构造方法,那么默认的无参构造方法便会失效,调用不到,如果需要,需要显示的定义无参构造方法
-
作用:用来为新创建的对象中的成员变量进行初始化
public Car(){
System.out.println("无参构造方法");
name=null;
color=null;
price=0;
}//无参构造
Car car=new Car();// Car car=new Car();//无参调用
public Car(String n,String m,int p){//有参构造
System.out.println("有参构造方法");
name=n;
color=m;
price = 300000;
}
Car dzcar=new Car("大众","黑色",30000);//有参调用
方法重载
- 方法的重载是指一个类中具有相同的名字,但参数个数不同的多个方法
- 如何区分名称相同的多个方法:通过参数的个数,类型,顺序来区分
注:但系统无法区分返回值类型,所以方法的重载跟返回值类型没有任何关系
public Car(){
System.out.println("无参构造方法");
name=null;
color=null;
price=0;
}
public Car(String n,String m,int p){
System.out.println("有参构造方法");
name=n;
color=m;
price = 300000;
}//这俩方法就是方法的重载
对象与引用
- Java语言中除了基本数据类型以外都属于引用类型
- Java中的对象是通过引用对其操作的
class Car{
String name;
String color;
int price;
}
Car bm = new Car();
- 右边的“new Car()”,是以Car类为模板,在堆空间里创建一个Car类对象
- 左边的“Car bm”创建了一个Car类型引用变量。所谓Car类的引用,就是以后可以用来指向Car对象的对象引用
- "="操作符使对象引用指向刚创建的那个Car对象(即把对象存储的地址赋值给了bm)
我们可以把这句拆开两部分理解
Car bm;
bm = new Car;
这样写,就比较清楚了,有两个实体;一个是对象引用变量,一个是对象本身