1.面向对象是什么?
1.1 面向对象程序设计(Object Oriented Programming,OOP),是一种以对象为核心的新的编程思想,在它之前还有一种以过程为中心的编程思想叫面向过程的程序设计(Procedure-Oriented Programming,POP)
1.2 面向对象的三大特性:
封装、继承、多态。
1.3 面向对象和面向过程的区别:
1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。
例如:求班级学生平均分,做法是:
- 第一步:计算班级总分
- 第二步:计算平均分
- 第三步:输出平均分
2.面向对象:先分析有什么对象,对象有什么属性(数据)和方法(操作)
例如:求班级学生平均分,做法是:
- 分析有什么对象:有班级对象,还有学生对象
- 学生对象有什么属性:姓名,分数;没有方法
- 班级有什么属性:多名学生;方法:计算平均分
这其中的对象、属性、方法分别是什么呢?
2.对象简介
2.1 什么是对象?
- 万事万物皆对象
- 生活中的对象:李逵,林冲,我的办公桌,他的电脑
- 程序中的对象:登录按钮,我今天的第一个订单,我的账号
- 对象强调的是一个具体的个体
2.2 对象是由什么构成的?
- 对象由状态和行为构成。
- 对象的状态是指对象的数据,对象的状态由变量表示,也叫对象的属性。(学生名字,年龄,身高,性别等。)
- 对象的行为是指对象的功能,对象的行为由方法表示。(学生做作业,走路、吃饭、唱歌等行为。)
2.3 对象是怎么创建的
- 对象是由类实例化时创建的,因此创建对象必须先定义类。
- 类是对象的模板,类中定义了什么属性和方法,由这个类实例化的对象就有什么属性和方法。
- 类是一次性定义,对象可以多次创建。
3.类简介
3.1 什么是类
1.类是具有相同的状态和相同的行为的一组对象的集合。
2.类与对象的关系:
- 类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的个体,因而也称实例(Instance)。类和对象就如同概念和实物之间的关系一样,类就好比是一个模板,而对象就是该模板下的一个实例。
- 比如动物就是一个类,而动物中中特指的猫、狗、鸡、鸭等就是对动物这个类的具体化就叫对象。
- 类和对象不是不变的,而是在不同环境下有不同的代表。又比如用猫来说,在这儿猫又是一个类了,而我家的那只猫或是加菲猫等才是对象。
- 总言之就是一个概念上和一个具体的个体之间的关系。
3.2 类的定义
语法:
public class 类名 {
//可编写0至n个属性
数据类型 变量名1;
数据类型 变量名2;
//可编写0至n个方法
修饰符 返回值类型 方法名(参数){
执行语句;
}
}
注意:
- public类的类名必须和类所在文件的文件名一致
- 如果不是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.概念
通过类创建对象的过程称为类的实例化。实例化的结果是产生了一个实例,实例也叫对象。
4.2.语法
new就是实例化的意思,new也是分配内存的意思
类名 对象名 = new 类名();
4.3.示例
Student s1 =new Student(); //s1就是一个对象
Student s2 =new Student(); //s2也是一个对象
4.4.对象的内存分配
5.使用对象
5.1 对象调用属性和方法是使用成员运算符.来完成的
5.2 对象调用属性
Student s1 =new Student();
s1.name="张三";
s1.score=78;
s1.no="123456";
Student s2 =new Student();
s2.name="李四";
s2.score=98;
s2.no="123455";
5.2 对象调用方法
public class Test {
public static void main(String[] args) {
Student s1 =new Student();
s1.name="张三";
s1.score=78;
s1.no="123456";
s1.play();
Student s2 =new Student();
s2.name="李四";
s2.score=98;
s2.no="123455";
s2.play();
}
}
运行结果:
注:
一般一个类写一个文件,如我的学生类是一个文件,测试类是一个文件。
通过刚刚的例子会发现每实例化一个对象时都需要通过多象名去调用相应的属性后再去赋值比较麻烦,那有没有简化一点的方法呢?
6.构造方法
6.1.什么是构造方法呢?
1.构造方法,是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。
2.构造方法也叫构造函数,或者叫构造器
3.定义
- 构造方法的方法名必须与类名相同
- 构造方法没有返回值,也不写void
4.实例
class Student {
//构造方法
Student(){
}
}
6.2构造方法的作用
构造方法的作用:为对象的属性初始化。
public class Test {
public static void main(String[] args) {
Student s1 =new Student("张三",99,"123456");
s1.play();
Student s2 =new Student("李四",89,"123455");
s2.play();
}
}
结果:
其实上面的例子中如果我们不使用对象相应的属性赋值也可以。
public class Test {
public static void main(String[] args) {
Student s1 =new Student();
s1.play();
Student s2 =new Student();
s2.play();
}
}
此时的结果:
那么这些默认值是哪儿来的呢?其实在运行时系统会自动帮我们补上一个默认构造函数。
6.3默认构造函数:
一个类如果没有显示的定义构造函数,那么这个类默认具有无参的构造函数。
默认构造函数为对象的属性赋默认值。
示例
public class Student {
String name;
int score;
String no;
//类的方法(类的行为)
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
System.out.println();
}
}
public class Test {
public static void main(String[] args) {
Student s1 =new Student();
s1.play();
Student s2 =new Student();
s2.play();
}
}
结果:- 因为本例中没有定义构造函数,系统会自动添加一个默认构造函数,默认构造函数是无参的,会为所有的属性赋默认值,因此name是null,score是0,no是null。
注:一旦类中写了构造函数,那么就没有构造函数。
例如
import java.util.Arrays;
public class Student {
String name;
int score;
String no;
//类的方法(类的行为)
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
System.out.println();
}
public Student(String name, int score, String no) { //带三个参数的构造函数
this.name = name;
this.score = score;
this.no = no;
}
}
public class Test {
public static void main(String[] args) {
Student s1 =new Student("张三",99,"123456");
s1.play();
Student s2 =new Student("李四",89,"123455");
s2.play();
}
}
结果:
但此时新的问题又出现了:我只输出姓名和成绩,不输出学号,但是play()方法里又必须得输出学号,此时咋办呢?
7.方法重载(overload)
7.1概念
- 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
- 方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数或参数的顺序不同的方法。
- Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。
- 调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法。
7.2定义:
在同一个类中方法名相同,参数不同,与返回值类型无关
7.3运用:
1.就拿构造函数赋初始值问题来说明。
实例
public class Student {
String name;
int score;
String no;
//类的方法(类的行为)
public void play(){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
System.out.println();
}
public Student() { //1.无参构造函数 注意:不是默认构造函数,此时已经没有默认构造函数了
}
public Student(String name) { //2.带一个参数的构造函数
this.name = name;
}
public Student(String name, int score) { //3.带两个参数的构造函数
this.name = name;
this.score = score;
}
public Student(String name, int score, String no) { //4.带3个参数的构造函数
this.name = name;
this.score = score;
this.no = no;
}
里面的1、2、3、4就是方法重载的运用,想要需要给几个数据赋初始值就调用带几个参数的构造方法。
public class Test {
public static void main(String[] args) {
Student s1 =new Student(); //啥都不知道就调用无参构造方法
s1.play();
Student s2 =new Student("张三"); //需要给1个赋初始值就调用带1个参数的构造方法
s2.play();
Student s3 =new Student("张三",90); //需要给2个赋初始值就调用带2个参数的构造方法
s3.play();
Student s4 =new Student("张三",90,"123456"); //需要给3个赋初始值就调用带3个参数的构造方法
s4.play();
}
}
结果
2 6.3中结尾的问题
示例
public class Student {
//类的方法(类的行为)
//重载1
public void play(String name){
System.out.printf("我的名字是%s",name);
System.out.println();
}
//重载2
public void play(String name,int score){
System.out.printf("我的名字是%s,我的成绩是%d",name,score);
System.out.println();
}
//重载3
public void play(String name,int score,String no){
System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
System.out.println();
}
}
public class Test {
public static void main(String[] args) {
Student s1 =new Student();
s1.play("张三");
s1.play("张三",90);
s1.play("张三",90,"123456");
}
}