Java基础知识Day07--类与对象
Day07
1.1 类与对象
1.类:是一组相关属性和行为**的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
-
属性:就是该事物的状态信息。
-
行为:就是该事物能够做什么。
举例:小猫。
属性:名字、体重、年龄、颜色。 行为:走、跑、叫。
2.对象:是一类事物的具体体现。对象是类的一个实例**,必须具备该类事物的属性和行为。
举例:一只小猫。
属性:小花、5kg、2 岁、橘猫。 行为:踩奶、撒娇、喵喵叫。
3.类与对象的关系:
- 类是对一类事物的描述,是抽象的。
- 对象是一类事物的实例,是具体的
- 类是对象的模板,对象是类的实体
1.2 类的定义
1.类的组成:
成员变量:对应事物的属性。
成员方法:对应事物的行为。
2.类的定义格式:
public class Student {
//成员变量
//成员方法
}
- 定义类:定义类的成员,包括成员变量和成员方法。
- 成员变量:同变量的定义,只是位置在类中,方法外。
- 成员方法:同方法的定义,只是要把static去掉。
例如:定义一个学生类
public class Student {
/**成员变量
* 姓名
* 年龄*/
String name;
int age;
/**成员方法
* 吃饭 public void eat(){}
* 睡觉 public void sleep(){}
* 学习 public void study(){}*/
public void eat() {
System.out.println("吃饭饭");
}
public void sleep() {
System.out.println("睡觉觉");
}
public void study() {
System.out.println("学习");
}
1.3对象的创建
1.导包:也就是指出需要使用的类在什么位置。
-
格式:import 包名称.类名称;
例如:import nuc.edu.ss.day06.demo01.Student;
-
对于和当前类属于同一个包的情况,可以省略导包语句不写。
2.创建对象:
-
格式:类名称 对象名 = new 类名称();
例如:Student stu = new Studenr();
3.使用对象:
-
使用成员变量:对象名.成员变量名;
注意:如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
-
使用成员方法:对象名.成员方法名(参数);
想用谁就用对象名点谁。
1.4对象内存图
1.一个对象的内存图:
2.两个对象使用同一个方法的内存图:
3.两个引用指向同一个对象的内存图:
1.5 使用对象类型作为方法的参数
- 当一个对象作为参数,传递到方法当中时,实际传递进去的是对象的地址值。
1.6使用对象类型作为方法的返回值
返回值其实就是对象的地址值。
1.7 局部变量和成员变量
public class Demo01Car {
String color;//成员变量
public void drive() {
double speed;//局部变量
}
}
1.定义的位置不一样
- 局部变量:在方法的内部。
- 成员变量:在方法的外部,直接写在类当中。
2.作用范围不一样
- 局部变量:只有方法当中才可以使用,出了方法就不能再用。
- 成员变量:整个类都可以通用。
3.默认值不一样
- 局部变量:没有默认值,如果要想使用,必须手动进行赋值。
- 成员变量:如果没有赋值,会有默认值,规则和数组一样。
4.内存的位置不一样
- 局部变量:位于栈内存。
- 成员变量:位于堆内存。
5.生命周期不一样
- 局部变量:随着方法进栈而诞生,随着方法出栈而消失。
- 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。
1.8面向对象的三大特征之封装性
1.封装
封装就是将一些细节信息隐藏起来,对于外界不可见。
-
方法就是一种封装。
-
关键字private也是一种封装。
2.封装的步骤
-
使用 private 关键字来修饰成员变量。
-
对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法。
3.封装的操作–private关键字
(1)含义
-
private是一个权限修饰符,代表最小权限。
-
可以修饰成员变量和成员方法。
-
被private修饰后的成员变量和成员方法,只在本类中才能访问
(2)格式
private 数据类型 变量名;
- 使用private修饰成员变量,代码如下:
public class Person {
private String name;
private int age;
}
- 提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:
public class Person {
private String name;
private int age;
public void setName(String n) { //Setter方法
name = n;
}
public String getName() { //Getter方法
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
注意:对于Setter来说,不能有返回值,参数类型和成员变量对应;对于Getter来说,不能有参数,返回值类型与成员变量对应。
- 对于基本类型中的boolean值,Getter方法要写成isXxx的形式,Setter方法不变。
4.封装的优化1–this关键字
当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量,如果需要访问本类当中的成员变量,需要使用this关键字
(1)含义:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。
(2)格式:this.成员变量名
示例代码如下:
public class Person {
private String name;//成员变量
private String age;
public void sayHello(String name) { //局部变量
System.out.println(name + "说:" + this.name + "你好!");
}
- Tips:方法中只有一个变量名时,默认也是使用 this 修饰,可以省略不写。
5.封装的优化2–构造方法
(1)作用:当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。
- Tips:无论你是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法, 一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。
(2)格式:
修饰符 构造方法名(参数列表){
// 方法体
}
- 构造方法的额方法名与它所在的类名相同,它没有返回值,不需要返回值类型,也不需要void,代码示例如下:
public class Person {
private String name;
private int age;
/**无参构造方法*/
public Person() {}
/**有参构造方法*/
public Person(String name,int age) {
this.name = name;
this.age = age;
}
}
(3)注意:
-
如果你不提供构造方法,系统会给出无参数构造方法。
-
如果你提供了构造方法,系统将不再提供无参数构造方法。
-
构造方法是可以重载的,既可以定义参数,也可以不定义参数。
6.定义一个标准的类:
要求:
- 所以成员变量都要使用private关键字修饰。
- 为每一个成员变量编写一对Setter方法和Getter方法。
- 编写一个无参数的构造方法。
- 编写一个有参数的构造方法。
这样标准的类也叫Java Bean.
定义一个标准的学生类,代码示例如下:
public class Student {
//成员变量
private String name;
private int age;
//无参构造方法
public Student() {
}
//带参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成员方法(Getter方法和Setter方法)
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 class Demo03Student {
public static void main(String[] args) {
//无参构造使用
Student stu1 = new Student();
stu1.setName("张三");
stu1.setAge(18);
System.out.println("姓名:" + stu1.getName() + ",芳龄:" + stu1.getAge());
System.out.println("==================");
//带参构造使用
Student stu2 = new Student("李四",18);
System.out.println("姓名:" + stu2.getName() + ",芳龄:" + stu2.getAge());
}
}