JavaSE个人学习心得(八)
面向对象
首先:面向对象是一种思想,而不是技术
因为这种思想来源于生活, 生活中我们解决问题, 就是一个个的对象在一起打交道从而将问题解决了. 如果写代码的时候,
也能按照这套思想进行操作, 编程就会更加贴切与生活.
例:
解决随机数的问题 —> 找来了Random对象
解决键盘录入的问题 —> 找来了Scanner对象
- 以什么形式去组织代码
- 以什么形式去解决问题
对于面向对象
我们要学会如何去设计对象
学习对已用的对象如何使用
类和对象
- Java中想要创建对象,必须先有类的存在
类 : 是一组相关属性和行为的集合, 将类理解为是对象的设计图
既然类是对象的设计图, 那就是说, 需要根据类, 才能创建出对象关系 : 依赖关系
需要根据类去创建对象
数量关系
一对多的关系, 根据一个类, 可以创建出多个对象.
类的组成
属性(名词):
成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外.
行为(动词):
成员方法: 跟之前定义方法的格式一样, 只不过去掉了 static 关键字
public class Student {
String name;
int age;
public void eat(){
System.out.println("学生吃饭...");
}
}
根据类创建对象,对象中的成员如何使用
1. 创建对象的格式
类名 对象名 = new 类名();
Student stu = new Student();
// 打印对象名, 会看到对象的内存地址
// 全类名@十六进制地址值
// com.itheima.oop.Student@233ac45
System.out.println(stu);
2. 使用成员变量的格式
对象名.变量名;
stu.age = 18;
System.out.println(stu.age);
if(stu.age >= 18){
}
for(int i = 1; i <= stu.age; i++){
}
3. 使用成员方法的格式
对象名.方法名(实际参数);
stu.eat();
成员变量和局部变量的区别
1. 类中位置不同
成员变量 : 方法外
局部变量 : 方法中
2. 初始化值不同
成员变量 : 有默认初始化值
局部变量 : 没有默认初始化值, 使用之前必须完成赋值
3. 内存位置不同
成员变量 : 堆内存
局部变量 : 栈内存
4. 生命周期不同
成员变量 : 随着对象的创建而存在, 随着对象的消失而消失
局部变量 : 随着方法的调用而存在, 随着方法的弹栈而消失
5. 作用域
在自己所属的大括号中有效
this 关键字
this作用 :
引入: 可以区分局部变量和成员变量的重名问题
如果局部变量和成员变量出现了重名问题, Java 会根据就近原则, 优先使用局部变量
非要使用成员变量的话, 可以使用this进行区分
class Student {
int num = 10;
public void show(){
int num = 20;
System.out.println(num); // 20 ---> 局部变量
System.out.println(this.num); // 10 ---> 成员变量
}
}
作用: 可以调用自己本类的成员
this.本类成员变量;
this.本类成员方法();
this概念:
this代表当前类对象的引用(地址), 哪一个对象调用的方法, 方法中的this, 就代表哪一个对象.
stu1.show() ----> this ---> stu1的地址
stu2.show() ----> this ---> stu2的地址
构造方法
构造方法 \ 构造器
介绍 : 构建,创造一个对象的时候, 要执行的方法.
格式 :
1. 方法名与类名相同,大小写也必须一致
2. 没有返回值类型, 连void都没有
3. 没有具体的返回值(不能通过return语句, 带回结果数据)
执行时机:
1. 在创建对象的时候被系统自动调用执行
2. 每创建一次对象, 就会执行一次构造方法
作用:
1. 本质作用 : 创建对象
2. 结合执行时机 : 可以在创建对象的时候, 给成员变量初始化
Student stu = new Student("张三", 23);
注意事项:
1. 如果一个类中没有给出任何构造方法, 系统将会提供一个 [默认的] [无参数的] 构造方法
2. 如果手动编写过构造方法, 系统将不会再提供那个默认的无参构造了
建议: 今后 [无参] [带参] 都手动给出.
3. 构造方法不允许手动调用
stu.Student(); // 不允许, 编译错误
封装
面向对象三大特征 :
1. 封装
2. 继承
3. 多态
封装:
**隐藏实现细节, 仅对外暴露公共的访问方式**
封装在代码中常见的体现:
1. 将属性抽取到类中, 这是对数据进行的封装
用户信息: 001, 张三, 23, 1561111JQKA, 北京
没有使用封装:
String id = "001";
String name = "张三";
int age = 23;
...
使用封装:
class User {
String id;
String name;
int age;
String tel;
String address;
}
User u = new User("001","张三",23,"1561111JQKA","北京");
感受: 原来是一些零散的变量, 现在是整体的对象了
2. 将代码抽取到方法中, 这是对代码功能进行的封装
程序员A : 写好了一个方法
public void printArray(int[] arr){
// 遍历打印数组的代码
}
程序员B : 只需要关注方法能干什么, 以及怎么调用即可, 内部的实现, 都不需要关心
情况: 程序员A, 对遍历打印数组的代码, 进行了封装
权限修饰符
权限修饰符可以用于修饰成员(成员变量, 成员方法, 构造方法)
private : 同一个类中
(default) : 同一个类中, 同一个包
protected : 就业班讲
public : 任意位置访问
今后最常用的: private, public
标准JavaBean
所有成员变量私有化
提供出[空参][带参]构造方法
针对于私有的成员变量, 提供出setXxx\getXxx方法
package com.itheima.test;
public class Student {
// 属性: 姓名, 年龄
private String name;
private int age;
// 行为: show --> 展示自己的个人信息
public void show(){
System.out.println("姓名为:" + name + ", 年龄为:" + age);
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}