目录
一、 面向对象
1. 面向对象
1.1 概述
1.2 面向对象和面向过程
面向过程 : 侧重分步骤,需要考虑完成该功能的过程,第一步做什么,第二步做什么....
面向对象 : 侧重分模块(一部分负责这个,一部分负责那个)
总结 :
面向对象优势 : 可扩展性,可维护性,灵活性,使程序耦合度降低
缺点 : 性能比面向过程相对较差
1.3 构造方法
构造方法 是每个类都有的,并且用于创建该类的对象
如果 该类中 没有编写构造方法,那么 编译器会自动帮我们生成一个无参构造
如果 该类中 编写了构造方法,不管写的是不是有参,则 默认的无参构造都不再自动生成
所以 当我们在写有参构造的时候,可以手动编写一个无参构造
构造方法语法:修饰符 方法名/类名(参数列表){方法体}
构造方法的修饰符 我们只使用筏限控制即可,不能使用static构造方法
没有返回值,连void都没有
构造方法的方法名 必须和类名一致
1.4 类和对象
类 : 对一类事物客观描述的标准
根据不同属性划分为不同的类
对象 : 一切皆对象,是具体的个体,符合类标准的个体
根据不同的属性值划分不同的对象
局部变量: 方法中使用,作用域也在该方法中,具有临时性的,不适合长期存储,方法执行完局部变量也就销毁了
静态变量: 类级别的变量,所有该类对象访问这个变量时,值是一样的(同一类中,固有属性固有值)
成员变量: 对象级别的,所有该类的对象都有这个属性,但是值可能一样可能不一样(同一类中,相同属性对应一种或多种值)
如果方法中需要用到成员属性,则该方法一定是成员方法,反之则为静态方法
运用成员变量就是成员方法,运用静态变量就是静态方法(在静态方法中调用成员方法要定义新对象, 成员方法中的值不能赋给定义的新变量)
1.5 对象使用
package _01_OOP;
public class OOP_03 {
public static void main(String[] args) {
// 数据类型 变量名 = 值;
//对象的使用
//首先创建一个新的对象 可以给对象各个属性赋值 再输出
Student s1 = new Student();
s1.addrs = "河北邢台";
s1.age = -19;
s1.name = "张三";
System.out.println(s1.age);
s1.no = 10001;
Student s2 = new Student();
s2.addrs = "邯郸";
s2.age = 19;
s2.name = "李四";
System.out.println(s2.no);
System.out.println(s1.name);
System.out.println(s2.name);
}
}
1.6 Bean
就是公共的类,私有化的属性,公共的获取属性的方法(getter/setter),公共的无参构造
package _01_OOP;
public class User {
// 用户名
private String username;
// 密码
private String password;
// 昵称
private String nickname;
// 构造方法
public User() {
}
//可以选择有参构造和全参构造, 具体看功能要求 两者使用的方法是一样的
public User(String username, String password) {
// 有参构造 用于创建对象时 初始化成员变量的值
this.username = username;
this.password = password;
}
public User(String username, String password, String nickname) {
// 全参构造
this.username = username;
this.password = password;
this.nickname = nickname;
}
// getters and setters 用来获取和修改私有化成员变量的
public void setUsername(String username) {
// 成员方法中可以直接访问成员属性
// this 就是 当前对象,谁调用这个方法,this就是谁
if (username == "123") {
username = "缺心眼子";
}
this.username = username;
}
//获取用户名
public String getUsername() {
return username;
}
//获取密码
public String getPassword() {
return password;
}
//修改密码
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
1.7 实例化
实例化 : 就是值创建一个类的对象(实例)
User user = new User();
new 会去堆内存开辟一个内存空间,用于保存成员属性
调用构造方法(栈内存压栈),对堆内存数据进行初始化赋值,如果没有传入数据,则赋予默认值
构造方法执行完后,弹栈,并把堆内存地址返回给调用处,赋值给变量user
1 加载客户端类(OOP_05)
2 调用客户端类main方法
3 加载服务端类(User)
4 调用User的构造方法
5 堆内存创建空间,并对成员属性进行初始化
6 构造方法弹栈,并把内存地址赋值给变量
1.8 常见异常
User user = new User("admin", "root");
user = null;
// 一种是编译时异常
// 一种是运行时异常
// java.lang.NullPointerException 空指针异常, 是运行时异常
// 使用null 访问成员属性,就会出现空指针异常
System.out.println(user.getUsername());
1.9 对象调用静态属性
package _01_OOP;
public class OOP_07 {
static int a = 22;
int b = 33;
public static void main(String[] args) {
int a = 1;
OOP_07 o = new OOP_07();
System.out.println(o.b);
o = null;
// 可以通过对象调用静态属性
// 调用静态变量,因为在编译时,会自动把o换成对应的类名去调用
System.out.println(o.a);
// 调用静态变量
System.out.println(OOP_07.a);
// 调用局部变量
System.out.println(a);
}
}
1.10 注释事项
1.10.1 静态调用成员
静态调用成员时会报错, 除非将成员改为静态
1.10.2 传值和传引用
同数组一样, 传值时储存的是地址,所以不能更改, 但传引用的时候可以修改堆内存中的数值导致数据更改
1.10.3 区分成员方法和构造方法
package _01_OOP;
public class OOP_09 {
public static void main(String[] args) {
new OOP_09();
new OOP_09(22);
// new OOP_09("");
}
// 构造方法,修饰符可以不写
OOP_09() {
}
public OOP_09(int a) {
}
// 成员方法名可以和类名一样
// 如何区分同名的成员方法和构造方法呢? 看返回值,构造方法没有返回值,连void都没有
public void OOP_09(String a) {
}
}