【类与对象、封装、构造方法】
一. 面向对象思想概述
1. 面向过程和面向对象
- 面向过程: 强调过程(强调做一件事其中的每一个步骤)
- 面向对象: 做一件事, 不自己做, 而是利用对象来完成
举例
-
面向过程: 拿盆子 >> 放衣服 >> 放洗衣粉 >> 倒水 >> 泡 >> 搓 >> 漂洗 >> 拧干 >> 晾起来
-
面向对象: 衣服放到洗衣机 >> 放洗衣粉 >> 按下开关 >> 晾起来
叫女朋友来帮我洗
二. 类与对象
1. 什么是类和对象
- 类: 一类事物属性和行为的集合.
- 对象: 该类事物的具体体现.
2. 如何定义类
- 类: 就是Java中使用class定义出来的类.
- 属性(成员变量): 定义格式和以前的变量是一样的, 只是位置发生了改变, 在类中方法外.
- 行为(成员方法): 定义格式和以前基本相同, 只是去掉了static.
public class Person {
// 类中方法外
// 姓名
String name;
// 年龄
int age;
// 方法
// 吃饭
public void eat() {
System.out.println("人要吃饭");
}
// 睡觉
public void sleep() {
System.out.println("人要睡觉");
}
}
3. 如何创建对象和使用对象
创建和使用对象, 在测试类中的主方法中去创建和使用.
(1) 创建对象
// 类名 对象名 = new 类名();
// 创建了一个Person对象, 对象名是p
Person p = new Person();
(2) 使用对象
// 使用属性: 对象名.属性名
p.name;
// 使用行为: 对象名.方法名()
在一个类中想使用另一个类中的内容, 需要先创建对象.
/**
* 测试类
*/
public class PersonTest {
public static void main(String[] args) {
// 写代码, 模拟各种场景,
// 来测试功能类中的内容是否正确
// 创建了一个Person对象, 对象名是p
Person p = new Person();
// 对象名.属性名
p.name = "杨超越";
p.age = 20;
// 打印
System.out.println("姓名是: " + p.name + ", 年龄是: " + p.age);
p.eat();
p.sleep(8);
}
}
4. 成员变量和局部变量
[外链图片转存失败(img-8gJ7xiRe-1566980415899)(assets/1563502911445.png)]
成员变量和局部变量的区别
描述 | 位置不同 | 作用域(所在的大括号)不同 | 默认值不同 |
---|---|---|---|
局部变量 | 方法中或者方法声明上(参数列表) | 所在的方法中 | 没有默认值 |
成员变量 | 类中方法外 | 所在的类中 | 有默认值 |
局部变量在使用前, 必须赋值
数据类型 | 默认值 |
---|---|
整型(byte, short, int, long) | 0 |
浮点型(float, double) | 0.0 |
布尔(boolean) | false |
字符(char) | ‘\u0000’ |
引用数据类型 | null |
三. 创建对象的内存图
四. 封装【重点】
1. 封装的原则和格式
private: 可以修饰成员变量和成员方法, 作用: 被private修饰的内容, 只能在本类中被访问.
- 隐藏属性: 将属性使用private修饰
- 对外提供公共的访问方式: get/set方法
2. 优化1- this
-
在set方法中出现了, 成员变量和局部变量同名.
- 此时要遵循就近原则, 就出现了赋值语句变成了: 局部变量赋值给局部变量
age = age; name = name;
this: 能够解决什么问题?
- 当成员变量和局部变量同名的时候, 使用
this.变量名
获取到的是成员变量.
3. 优化2-构造方法
- 目标: 创建对象的同时, 给成员变量赋值.
构造方法
- 格式:
修饰符 构造方法名(参数列表) {}
- 没有返回值类型, 连void都没有
- 构造方法的名字和类名相同
// 空参构造/ 无参构造
public 类名() {
}
// 有参构造/ 全参构造/ 满参构造
public 类名(参数列表) { // 小括号中有参数, 参数依据类中所有成员变量来写
this.属性名 = 参数列表中局部变量的名字;
}
作用
- 用来创建对象(创建对象时, 一定调用了构造方法)
- 对类中的成员进行初始化(赋值)
注意事项:
- 如果类中没有手动给出任何的构造方法, 系统会默认提供空参构造
- 如果类中手动给出了任意一个构造方法, 系统将不会默认提供这个空参构造
案例
学生类
package com.demo.practice.homework6;
public class Student {
// 学生类Student
// 属性:语文成绩chinese,数学成绩math,英语成绩english
// 行为:求总成绩的方法getSum()
private int chinese;
private int math;
private int english;
public Student(){
}
public Student(int chinese,int math,int english){
this.chinese = chinese;
this.math = math;
this.english = english;
}
public void setChinese(int chinese){
this.chinese = chinese;
}
public void setMath(int math){
this.math = math;
}
public void setEnglish(int english){
this.english = english;
}
public int getChinese(){
return chinese;
}
public int getMath(){
return math;
}
public int getEnglish(){
return english;
}
public int getSum(){
return chinese+math+english;
}
}
测试类
package com.demo.practice.homework6;
public class Test {
public static void main(String[] args) {
Student s = new Student(70,60,90);
System.out.println("chinese:"+s.getChinese()+" math:"+s.getMath()+" english:"+s.getEnglish());
System.out.println("总分:"+s.getSum());
}
}
总体知识点总结
ps:!!!
还是上传照片方便