编程的本质是逻辑,编程思维的培养很重要。首先我们要理解面向过程和面向对象有什么区别:
面向过程:
面向过程是一种以“事件”为中心的编程思想,把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。需要实现一个功能的时候,看重的是开发的步骤和过程,
面向对象:
面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
当需要实现一个功能的时候,看重的并不是过程和步骤,而是关心的是对象,对象能做什么。
面向对象和面向过程最本质的区别在于考虑问题的出发点不同,面向过程是以事件流程为考虑问题的出发点,而面向对象则是以对象为考虑问题的出发点。
面向对象程序设计中代码间的相关性低(低耦合特性),使得代码很容易被复用和扩展,面向对象开发的程序一般更易维护、易复用、易扩展。面向过程的代码重用性低、扩展能力差。
现在主流的思想是面向对象,而实际的情况是软件设计的宏观层面是面向对象的,微观层面依然是面向过程的(方法内部的代码还是按照步骤编写的)。
※面向对象程序设计(Object Oriented Programming,OPP):
面向对象三大特性:
1.封装 、 2.继承 、 3.多态
1.对象
1.1.什么是对象
万事万物皆对象,对象强调的是一个具体的个体,例如:杨树就不是对象,我家门前第一颗杨树就是对象。
1.2.对象由什么构成
对象由状态和行为构成。
对象的状态是指对象的数据,对象的状态由变量表示,也叫对象的属性。
对象的行为是指对象的功能,对象的行为由方法表示。
1.3.对象是怎么创建的
对象是由类实例化时创建的,因此创建对象必须先定义类。
2.类
2.1.什么是类
类是具有相同的状态和相同的行为的一组对象的集合。
2.2.类的构成
类是由属性和方法构成的。
※类和对象是什么关系
类和对象的关系就如同模具和用这个模具制作出来的物品之间的关系。
一个类给出它的全部对象的一个统一的定义,而它的每个对象则是符合这种定义的一个实体(也称作实例),因此类和对象的关系就是抽象和具体的关系。
类是对象的模板,对象是类的的具体实例。类中定义了什么属性和方法,由这个类实例化的对象就有什么属性和方法。
类是一次性定义,对象可以多次创建。
- 类是对某一类事物的抽象描述,不是具体的个体。
- 对象是对某一事物的具体描述,是具体的个。
3.定义类
3.1.定义类的语法格式
public class 类名 {
成员变量声明;//即属性
成员方法声明;//即行为
}
具体:
public class 类名 {
//可编写0至n个属性
数据类型 变量名1;
数据类型 变量名2;
//可编写0至n个方法
修饰符 返回值类型 方法名(参数){
执行语句;
}
}
注意:
● class是声明类的关键字
● public类的类名必须和类所在文件的文件名一致
●如果不是public类,那么类名与类所在的文件名可以不一致
●类名的命名规范是:帕斯卡命名法,因此类名首字母大写。
示例:
public class Student {
//类的属性(类的状态)
String name;
int score;
String no;
//类的方法(类的行为)
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
}
}
4.实例化对象
通过类创建对象的过程称为类的实例化。实例化的结果是产生了一个实例,实例也叫对象。
4.1.创建对象(实例化对象)
一个对象称为类的一个实例,是类一次实例化的结果。
创建对象的语法格式:
类名 对象名 = new 类名();
示例:
Student s1 =new Student();
Student s2 =new Student();
1.new是关键词,称为实例化,同时也是分配内存的意思。
2.左边的类名为对象的数据类型。
3.右边的类名()称为类的构造方法。
一个对象由两部分构成,一个是对象的指针(也称对象的引用),二是对象的实例。
内存分配演示:
4.2.使用对象
对象调用属性和方法是使用成员运算符"."来完成的。
使用对象的语法格式:
对象名.属性 //引用对象的属性
对象名.方法名 //引用对象的方法
4.2.1.对象调用属性
public class Student {
String name;
int score;
String no;
public static void main(String[] args) {
Practice s1 = new Practice();
s1.name = "haha";
s1.score = 78;
Practice s2 = new Practice();
s2.name = "yaya";
s2.score = 98;
}
}
4.2.2.对象调用方法
public class Student {
String name;
int score;
String no;
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
}
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "haha";
s1.score = 78;
s1.play();
Student s2 = new Student();
s2.name = "yaya";
s2.score = 98;
s2.play();
}
运行结果:
我的名字是haha,我的成绩是78,我的学号是null
我的名字是yaya,我的成绩是98,我的学号是null
4.2.3.对象数组
示例:
需求:
1.班级里有5名学生,输入每名学生的姓名和总成绩。
2.根据学生总成绩从高到低排名,显示学生名次、姓名、总成绩。
分析:
1.有哪些对象?有学生对象,有班级对象
2.对象有什么属性和方法?
①.学生有姓名,成绩的属性,学生不需要方法
②.班级有多名学生的属性,班级有排序方法,输出的方法
代码:
1:创建学生类
public class Student {
//属性
String name;
int score;
//构造
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
2.创建班级类
public class ClassInfo {
//属性
Student []stus = null;
//构造函数初始化班级大小
public ClassInfo(int size){
this.stus = new Student[size];
}
//排序方法
public void sort(){
if(this.stus.length==0){
return;
}
for (int i = 0; i < this.stus.length-1; i++) {
for (int j = 0; j < this.stus.length - i - 1; j++) {
if(this.stus[j].score<this.stus[j+1].score){
Student temp = this.stus[j];
this.stus[j] = this.stus[j+1];
this.stus[j+1] = temp;
}
}
}
}
//输出方法
public void print(){
for (int i = 0; i < stus.length; i++) {
System.out.printf("姓名:%s,成绩%d,名次:%d",stus[i].name,stus[i].score,(i+1));
System.out.println();
}
}
}
3.创建测试类
public class Test {
public static void main(String[] args) {
//1:创建5个学生
Student s1 = new Student("学生1",60);
Student s2 = new Student("学生2",80);
Student s3 = new Student("学生3",90);
Student s4 = new Student("学生4",65);
Student s5 = new Student("学生5",70);
//2:创建班级
ClassInfo classInfo = new ClassInfo(5);
classInfo.stus[0] = s1;
classInfo.stus[1] = s2;
classInfo.stus[2] = s3;
classInfo.stus[3] = s4;
classInfo.stus[4] = s5;
//3:排序
classInfo.sort();
//4:输出
classInfo.print();
}
}
运行结果:
姓名:学生3,成绩90,名次:1
姓名:学生2,成绩80,名次:2
姓名:学生5,成绩70,名次:3
姓名:学生4,成绩65,名次:4
姓名:学生1,成绩60,名次:5