面向对象
什么是面向对象
通俗来说,就是拿东西过来做对应的事情
重点:
- 如何获取已有对象并使用
- 如何自己设计对象并使用
设计对象并使用
类和对象
- 类(设计图):是对象共有特征的描述
- 对象:是真实存在的东西
- 在Java中,必须先设计类 ,才能获得对象。
如何定义类
public class 类名 {
1. 成员变量(代表属性,一般是名词),只定义,不给值
2. 成员方法(代表行为,一般是动词)
3. 构造器
4. 代码块
5. 内部类
}
// 例如定义一个 手机 类
public class Phone{
// 属性
String brand;
double price;
// 行为(方法)
public void call(){
}
public void playGame() {
}
}
如何得到类的对象: 使用类名 对象名 = new 类名()
的方式
Phone ph = new Phone()
如何使用对象:
- 访问属性:
对象名.成员变量
p.brand = "oppo”
- 访问行为:
对象名.方法名()
p.call()
定义类的补充注意事项
- 用来描述一类事物的类,专业叫做:
javabean类
,里面是不写main
方法的 - 编写main方法的类,叫做
测试类
,可以在测试类中创建javabean
类的对象并赋值调用 javabean类
包含成员变量和成员方法- 一个Java文件中可以定义多个class类,且只能一个类是public修改,而public修饰的类名必须成为代码文件名。实际开发中最好还是一个一个文件定义一个class类
- 成员变量的完整定义格式:
修饰符 数据类型 变量名= 初始化值
,一般无需指定初始化值,存在默认值
封装
面向对象的三大特性之一。
对象代表什么,就得封装对应的数据,并提供数据相对应的行为
例如:人关门,门是自己关的,所以开关这个行为就要放在门这个类中
private关键字
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 被
private
修饰的成员只能在本类中才能访问 - 所以每个
private
属性都提供一个setXxx
与getXxx
方法进行赋值和获取属性值,这两个方法使用public
修饰
this关键字
成员变量和局部变量
成员方法中定义的变量是局部变量,如果两个变量同名了,这时要使用哪一个变量呢?需要用到就近原则,谁近用谁。
如果想要使用成员变量,那么可以在成员变量前加上this
关键字,即this.brand
this的作用: 可以区分成员变量和局部变量
构造方法
也叫做构造器、构造函数
作用: 在创建对象的时候给成员变量进行初始化的,也就是在创建对象的时候顺便赋值的
格式:
public class Student {
修饰符 类名(参数){
方法体;
}
}
特点:
- 方法名与类名相同,大小写也要一致
- 没有返回值类型,连void都没有
- 没有具体的返回值,不能由return带回结果数据
执行时机: - 创建对象的时候由虚拟机调用,不能手动调用构造方法
- 每创建一次对象,就会调用一次构造方法
public class Student {
private String name;
private int age;
// 如果没有写任何构造方法,虚拟机会自动添加,空参构造方法
public Student(){
...
}
// 带全部参数的构造方法
public Student (String name, int age){
...
}
}
注意事项:
① 构造方法的定义
- 如果没有定义构造方法,系统将会默认给出一个默认的无参构造方法;
- 如果定义了构造方法,系统将不再提供默认的构造方法
②构造方法的重载
- 带参构造方法和无参构造方法,两者方法名相同,参数不同,这就是构造方法的重载
③推荐的使用方式 - 无论是否使用,都手动书写无参构造 和带全部参数的构造方法
标准JavaBean
- 类名要见名知义
- 成员变量使用
private
修饰 - 提供至少两个构造方法,分别是无参构造方法和带全部参数的构造方法
- 成员方法:每一个成员变量对应的
setXxx/getXxx
,如果还有其他行为,也要写上
例:写一个注册页面的JavaBean类
public static User{
private String username;
private String pwd;
private String email;
private String gender;
private int age;
// 无参构造方法
public User(){}
// 带全部参数的构造方法
public User(String name, String pwd, String email, String gender, int age){
this.name = name;
this.pwd = pwd;
this.confirmPwd = confirmPwd;
this.email = email;
this.gender = gender;
this.age = age;
}
public void setName(String username){
this.username = username;
}
public String name() {
return this.username;
}
...
}
这里在IDEA
中有个快捷键,一键生成构造方法和set、get。alt + insert
或aly + Fn + insert
插件:PTG
,一秒生成标准javabean。File -> Seetings -> plugins
。安装完成后,右键,选择PTG for JavaBean
对象内存图
一个对象的内存图
Student s = new Student
- 加载class文件
- 申明局部变量
- 在堆内存中开辟一个空间
- 默认初始化
- 显示初始化
- 构造方法初始化
- 将堆内存中的地址值赋值给左边的局部变量
多个对象的内存图
两个变量指向同一个对象的内存图
当两个变量指向同一个空间的时候,那么其他变量再次访问的时候,就是改变之后的结果了
this的内存原理
this的作用: 区分局部变量和成员变量
this的本质: 所在方法调用者的地址值
基本数据类型和引用数据类型的区别
本质区别:
- 基本数据类型:存储的是真实的数据值
- 引用数据类型:存储的是 地址值
局部变量和成员变量的区别
成员变量: 类中方法外的变量
局部变量: 方法中的变量