本章提要:面向对象是Java的重中之重,内容复杂多样,且逻辑性强,写的内容也是本人对这块知识的浅薄理解,希望对大家有所帮助,我会使用文字和代码结合解释,所涉及内容可查看目录,话不多说,开写!
一、面向对象
1.什么是面向对象
编程思想:
面向过程:解决问题,将一个繁杂的问题分解成简单的步骤,然后一步步地去做,最后达到最终地目标。
把大象装冰箱总共分几步?
1)把冰箱门打开
2)把大象装进去
3)把冰箱门关上
面向对象:解决问题时,关心问题中涉及地对象,以及对象地行为和特征,由对象的行为组合最终解决问题.
大象装进冰箱:
1)问题中涉及了哪些对象:冰箱(主体),大象(依赖)
2)分析每一种对象的行为:
冰箱:开门,装东西,关门
大象:没有主动行为
3)再由对象的行为进行组合得到最终的结果
冰箱.开门
冰箱.装(大象)
冰箱.关门
面向对象的相关概念:
类:类别,类型 class,type
对现实世界中具有相同行为或特征的一类事物的统称。
对象:Object,实例
对象就是现实世界中具体的一个事物。
行为:对象可以做的事情
特征:对象的特点
创建对象:通过一个类,创建出这个类的一个实例。
对象与类的关系:
类是对象的抽象描述方式
行为:使用方法
特征:使用属性
对象是类的实例化,具体化,在Java中对象是内存空间
2.Java中的类
类是一种数据类型(本质)
类是Java中程序员自己定义的一种数据类型,自定义类型
处理学生的信息:
姓名
性别
年龄
学号
…
2.1类的语法
修饰符 class 类名{
类体
}
1)class关键字,表示定义一个类
2)修饰符:限定类的使用范围和使用方式
权限修饰符:public,private,protected,默认的
static:静态的
final:最终的
abstract:抽象的
3)类体:在一个类中可以写
a)属性:也叫字段(Field),也就是定义在类中的变量/常量,分为静态的/非静态的
b)方法:Method,静态的/非静态的.
c)构造方法:Constructor 类的构造器,用来构造类的对象的
d)块:静态块/非静态块
e)类:内部类
定义一个学生类
特征:姓名,学号,性别,年龄
行为:吃,睡,玩
public class Student {
//特征:使用属性描述
String name;
String num;
String sex;
int age;
// 行为:使用方法描述
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("在宿舍睡觉");
}
public void play() {
System.out.println("玩游戏");
}
}
2.2使用类
类的本质是数据类型
定义变量,定义数组,作为方法的参数,作为返回值类型
2.3创建类的对象
类名 变量=new 类名();
2.4调用类的属性和方法
对象/变量.属性/方法()
2.5内存机制
2.6构造方法
构造方法是指创建对象的的东西,构造方法不是方法,它是构造器
定义:
- 构造方法的名字,必须与类名完全相同
- 构造方法不能有返回值
- 构造方法可以有参数列表
- 构造方法还可以重载。
修饰符(参数列表){
构造方法体
}
注意:
- 使用new创建类的对象,实际就是在调用类的构造方法
new Student(); 就是在调用Student类的无参构造方法
2.创建对象时,可以通过传递参数选择不同的构造方法进行调用 - 如果一个类没有定义任何的构造方法,在编译时,编译器就会自动地为类添加一个无参构造方法,称为默认无参构造方法。如果类中定义了任何地构造方法,默认无参构造方法将不会再被添加。
- 构造方法没有返回值类型,有返回值类型地方法就是类的方法
2.7构造方法和一般方法的不同:
1、构造方法是在new对象的时候运行,而一般的方法是在对象调用的时候才执行。
2、一个对象的建立,构造方法只执行一次,而一般方法可以被改对象调用多次。
3.类和对象的总结
1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。
2、对象:真实存在的对象
3、类中包含:
1)所有对象所共有的特征–属性(静)
2)所有对象所共有的行为–方法(动)
4、类是对象的模板,对象是类的具体实例。
5、一个类可以创建多个对象:同一个类的不同对象,结构相同,数据不同。
易混淆知识点:
int num = 3;
int[] nums = new int[3];
Student student = new Student(); // student :变量、实例、对象
Student[] students = new Student[3];
Teacher teacher = new Teacher();
Teacher[] teachers = new Teacher[3];
int、int[]、Student、Student[]这些都是数据类型,数据类型的后面是这种类型的一个变量。
格式: 数据类型 变量
var v;
数据类型的默认值
数据类型的默认值:
int类型默认值是:0
double类型默认值是:0.0
boolean类型默认值是:false
String类型默认值是:null
int[]类型默认值是:null
Student[]类型默认值是:null
boolean[]类型默认值是:null
int[] array = new int[3]; 里面的存放默认值是0
boolean[] array = new boolean[3]; 里面的存放默认值是false
Student[] array = new Student[3];里面的存放默认值是null
4.打印对象信息
打印对象信息有多种方法:
1.可以自己编写一个函数去返回信息
public String getInfo() {
return "Student[id:" + id + ",name:" + name + ",age:" + age + ",gender:" + gender + "]";
}
2.重写toString()方法
重写toString()后,直接打印对象即可,不需要调用toString()
二、面向对象使用细节讲解
1.属性私有化
上图发现当属性是public公有的时侯,在别的类中创建的实例对象,可以直接给属性赋值,但是为了隐藏对象的细节,让使用者不能随意访问数据,要进行属性私有化,让使用者只能通过设计好的set/get方法来访问和修改数据。保证了数据的安全性,同时也确保了代码的可维护性。
当我们将属性私有化时,别的类中实例化的对象无法直接使用属性,只能通过set/get方法来设置或获取属性值
所以属性一般是私有的 private:访问范围 是 当前类
2.setXXX(Object XXX)中要注意的地方
实例对象调用setId()方法,出入了一个值1,这个值应该最后通过setId()方法,赋给属性id 但是当我用鼠标指到左边被赋值的id上的时候,显示一句话The value id assigned to ‘id’ is never used(赋给’id’的值id永远不会被使用)
当我指到右边id的时候,显示一句话Variable ‘id’ is assigned to itself (变量’id’被赋值给自己)。首先要先明确左边的id是被赋值的id,我们想要他代表的是属性id,而右边的id是传入的参数。所以说当我们执行id=id的时候,左边的id并没有被赋值,这是为什么呢?
这里就要引出一个原则:就近原则,所以在函数setId(int id)中,id=id,左边的id相当于也是传递的参数。 那么我们如何去解决这个问题呢?
这里我们引入一个关键字 this
this有两种使用方式
1.this.属性
调用当前对象的属性
在构造方法中,this代表当前被创建的对象
在普通方法中,this代表调用当前方法的对象
2.this()/this(参数列表)
只能出现在构造方法中,必须是构造方法的第一行。
调用当前类的其它构造方法,根据参数列表匹配相应的构造函数
创建student2实例对象时,使用了public Student(int id, String name, int age)的构造方法,而该构造方法中使用了this(参数列表),this(id, name, age, “男”);this()将会去匹配相应参数列表的构造函数并调用。调用的构造方法完成后再去执行,public Student(int id, String name, int age)构造方法的方法体其余的语句。
附上Student类完整代码
// 实体类:和数据库表一一对应
public class Student {
//属性 field:静态的描述这个事物特征
// 属性一般是私有的 private:访问范围 是 当前类
private int id;
private String name;
private int age;
private String gender;
// 方法:method
//无参构造
//java默认会提供一个无参构造方法
// 如果你自己实现了任何一个构造方法
// java就不会再提供这个默认的无参构造方法
public Student() {
// System.out.println("Student student1");
}
//有参构造方法
// Constructor:构造方法
public Student(int id, String name, int age, String gender) {
System.out.println("Student student2");
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public Student(int id, String name, int age) {
// Call to 'this()' must be first statement in constructor body
// new Student(int id, String name, int age, String gender)
this(id, name, age, "男");
System.out.println("Student student3");
}
// 实例方法,必须先new出一个对象,对象.方法();
public void setId(int id) {
// The value id assigned to 'id' is never used
// Variable 'id' is assigned to itself 变量id 自身给自身赋值
// 就近原则
// id = id;
// this:当前new出来对象
// student.setId(1) this当成student这个对象
this.id = id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
public String getInfo() {
return "Student[id:" + id + ",name:" + name + ",age:" + age + ",gender:" + gender + "]";
}
}
三、练习
1.定义长方形类
含:属性:宽、高(整型);
方法:求周长、面积;
构造方法3个:(1)无参——宽、高默认值为1;(2)1个参数——宽、高相等;(3)2个参数——宽、高各为参数值。
要求:进行测试计算周长和面积。
实体类
public class Rectangle {
private int heigth=1;
private int width=1;
public Rectangle() {
}
public Rectangle(int heigth) {
this.heigth = heigth;
this.width=heigth;
}
public Rectangle(int heigth, int width) {
this.heigth = heigth;
this.width = width;
}
public int getHeigth() {
return heigth;
}
public void setHeigth(int heigth) {
this.heigth = heigth;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int area(){
return this.heigth*this.width;
}
public int circumference(){
return this.width*2+this.heigth*2;
}
}
测试类
@Test
public void test6() {
Rectangle rectangle = new Rectangle();
System.out.println(rectangle.circumference());
System.out.println(rectangle.area());
Rectangle rectangle1 = new Rectangle(2);
System.out.println(rectangle1.circumference());
System.out.println(rectangle1.area());
Rectangle rectangle2 = new Rectangle(1, 2);
System.out.println(rectangle2.circumference());
System.out.println(rectangle2.area());
}
2.编写Java程序,模拟简单的计算器。
定义名为Number的类,其中有两个整型数据成员num1和num2,应声明为私有。编写构造方法,赋予num1和num2初始值,再为该类定义加(add)、减(sub)、乘(multi)、除(div)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。
在main方法中创建Number类的对象,调用各个方法,并显示计算结果。
Number类
public class Number {
private int num1;
private int num2;
public Number(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public Number() {
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int add() {
return this.num1 + this.num2;
}
public int sub() {
return this.num1 - this.num2;
}
public int multi() {
return this.num1 * this.num2;
}
public String div() {
String str = " ";
if (num2 != 0) {
str = this.num1 / this.num2 + " ";
} else {
str = "数据异常除数不能为0";
}
return str;
}
}
测试类
@Test
public void test5() {
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
Number number1 = new Number(num1, num2);
System.out.println(number1.add());
System.out.println(number1.sub());
System.out.println(number1.multi());
System.out.println(number1.div());
}