面向对象
编程思想
1.编程语言的思想分类
-
面向过程的编程语言:c语言
-
面向对象的编程语言:Java,C++,C#
2.两种编程思想的定义
-
面向过程的编程思想:仅知道一件事情怎样去做,每一步怎么做,不关心这件事谁在做。
-
面向对象的编程思想:不仅仅知道一件事怎么去做,更关心这件事谁在做。
注意:面向对象的编程思想和面向过程的编程思想并不是对立关系,面向对象的编程思想包含面向过程的编程思想。
面向对象的编程思想
1.名词普及:
-
类(Class):具有相同描述和行为的一组个体的总称,并且对其共同的描述和行为抽象所得的就是类的概念。
-
对象(Object):个体,一切皆对象。在编程中先定义类,在实例化对象。
-
属性(Field):用来描述和记录一类对象中,信息的变量;在一个对象当中记录属性信息,主要用来区分对象与对象。
-
方法(method):一组动作的集合,如果区分集合个体的话,这个集合称之为方法(不同的个体执行相同的方法,可能结果不同);如果某一个动作结合,任意对象执行结果都一样,我们把这种结合称之为函数。
2.类和对象之间的关系:
-
在现实生活中:
一个个体->一组个体->抽象->得到一组个体的描述方式和行为动作->类
-
在编程中:
编写一个类->类当中最基本的包含属性和方法->实例化(instantation、instance)->对象
-
类和对象的关系:
对象是按照类创建的实体,类是创建对象的设计图。
3.类的构成
1. 属性:
作用:记录信息。
本质:变量
(1)对象属性:
定义:这个类型的对象都具有,并且取值互不相同,并且修改取值互不干扰的属性。
作用:通过对象的取值不同区分不同的对象。
注意:若通过某一属性不能区分不同对象,那么可通过多个属性区分。
对象属性基本语法:
public class Student { String id; String college; String name; boolean isMale; int math; int chinese; }
对象属性的使用(取名+“.”+赋值)
import java.util.Scanner; public class TestStudent { public static void main(String[] args) { Student s1=new Student(); //1.对对象属性进行赋值 s1.id="202002313131"; s1.name="张三"; s1.college="计算机"; s1.chinese=100; s1.math=99; s1.isMale=true; //2.对对象属性的取值操作 System.out.println("姓名:"+s1.name); System.out.println("学院:"+s1.college); System.out.println("ID:"+s1.id); System.out.println("性别:"+(s1.isMale?"male":"female")); System.out.println("===================================="); Scanner scanner=new Scanner(System.in); Student s2=new Student(); System.out.println("请输入学号:"); s2.id=scanner.next(); System.out.println("是否为男:"); s2.isMale=scanner.nextBoolean(); System.out.println("姓名:"); s2.name=scanner.next(); System.out.println("学院:"); s2.college=scanner.next(); System.out.println("姓名:"+s2.name); System.out.println("学院:"+s2.college); System.out.println("ID:"+s2.id); System.out.println("性别:"+(s2.isMale?"male":"female")); } }
(2)类属性:
定义:用于描述这个类型本身的一些信息的属性,这个类型的对象都有且取值相同的属性。
特别推荐:类属性的命名最好全大写,单词与单词之间用“_”分开。
//类属性 一般使用static进行修饰,并在定义类属性的时候直接赋值 static int EYE_NUM=2; static int MOUTH_NUM=1; static int EAR_NUM=2;
类属性的访问方式:静态访问形式
System.out.println("学生的眼睛的数量:"+Student.EYE_NUM); System.out.println("学生的耳朵的数量:"+Student.EAR_NUM);
类属性的特点:一改全改 不论是通过对象的形式对类属性进行修改,还是通过类名的的形式修改。
s1.EYE_NUM=1; System.out.println(s1.EYE_NUM); System.out.println(Student.EYE_NUM);
final成为最终修饰符,用来修饰的变量会变成常量,一经赋值,不能修改。
static final int EYE_NUM=2;//常量的定义必须包含赋初值的过程 static final int MOUTH_NUM=1;
2.方法
(1)对象方法:
方法的定义:一组动作的集合,这一组动作要执行都执行(调用方法),要不执行都不执行。
注意:定义方法的流程是面向过程的,调用方法的过程是面向对象的。
方法的构成:
/* 方法签名{ 方法体 } 方法签名的构成: 【修饰符】返回值数据类型 方法名(参数列表)*/ int sss(){ return ...; }
方法返回值:当前方法执行完毕后,要交代给外界的结果。
注意:适当区分什么样的需要抛出返回值,什么样的方法只需要打印输出。
声明带有返回值的方法:
int ssss(){ int avg=(math+chinese)/2; return avg; }
类方法
与对象方法区别:
-
对象方法不适用static关键字进行修饰,类方法使用static关键字进行修饰;
-
对象方法必须使用对象加 . 调用,类方法可以使用对象加 . 调用,也可以使用类加 . 调用,推荐使用类加 . 调用(静态方法)
对象方法和类方法的使用场景:
-
对象方法:如果一个方法根据对象的不同,其运行结果有所不同的
-
类方法:类方法不区分对象的区别,任意本类的对象运行此方法,结果都一致,此时这种方法可以叫做工具方法。
注意:如果一个类当中所有的方法都是工具方法(静态方法),那么这种类被称之为工具类。
常见工具类:Arrays、Math、Collections
-
关于静态方法的细节:
在静态方法当中,不能够直接调用非静态结构(对象属性和对象方法)。如果有必要调用对象属性和对象方法的时候,需要在静态方法当中,实例化一个对象(或者通过参数传递一个对象进来),使用这个对象调用相应的对象属性或者对象方法。
注意:不仅仅是静态方法,在任意静态结构(静态方法、静态代码块)当中,都不能够直接调用非静态结构。但是在非静态结构当中(对象方法、非静态代码块),可以直接调用类属性和类方法等静态结构。
总结:静态不能直接调非静态,要调用,new对象;非静态能够直接调用静态。
解释:类加载和对象创建的流程(以Student s = new Student())为例:
-
步骤1: JVM接到new关键字的通知,表示当前要创建一个对象,JVM需要为这个对象开辟内存空间;
-
步骤2:这个对象有多大、内存空间开辟多大,这些信息都记录在类的元信息(元数据 metadata)当中;
-
步骤3:为了得到类的元信息,必须在为对象开辟内存空间之前,先将类信息加载进入内存静态区当中,类的元信息也就携带了静方法和静态全局变量;
-
步骤4:在得到类的元信息之后,JVM才知道这个对象有多大,开辟多大的内存空间,然后进行内存分配;
-
步骤5:内存分配完毕之后,执行对象的创建工作(对象属性赋值、对象可以执行的方法的加载)等工作,完成对象创建,并将对象的内存地址返回给创建者。
经过上述的步骤,一个对象才真正到手,才能够通过这个对象,调用对象属性和对象方法
-
类属性、类方法已经存在了,但是对象属性、对象方法不一定存在;对象属性、对象方法已经存在了,那么类属性、类方法是一定存在的。
转换一下:一定存在的结构(静态成员)不能够冒险调用不一定存在的结构(非静态成员);后加载的结构(非静态成员)一定能够调用先加载的结构(类属性、类方法)。
构造方法(构造器、Constructor):
-
定义:是一种声明在类当中的特殊方法,用来在实例化对象的时候,为对象执行初始化过程。
基本语法结构:
[修饰符] 类名(参数列表) { 构造方法的方法体 }
手动创建构造器的案例:
public class Student { String id; int age; String name; int math; int chinese; int english; int totalScore; int avgScore; Student() { //无参构造器 System.out.println("创建了一个Student对象"); } Student(String myId, int myAge, String myName) { //带有参数的构造器 id = myId; name = myName; age = myAge; } }
this关键字的使用:
定义:指向当前对象的一个代名词。
当前对象:谁在调用这个方法(这个方法在为谁服务),谁就是我的当前对象!
this关键字的特殊用法:还可以在对象方法中指代调用其他的对象方法:在对象方法当中通过this.的方式调用其他对象方法、对象属性的时候,this.可以不写,默认就有
注意:(对象方法)
打印输出时,一定要定义一个变量接方法里的返回值,然后直接打印变量。