面向对象
1.概述
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
该内容引用于:https://baike.baidu.com/item/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/2262089?fr=ge_ala
2.面向对象和面向过程
面向过程:侧重分步骤
面向对象:侧重分模块
面向对象优点:维护简单,可扩展性,代码复用性
3.构造方法
-
如果该类中没有写构造方法,则有一个默认无参的构造方法
-
一旦我们编写了构造方法,则默认的构造方法不再提供
-
构造方法没有返回值,并且连void都没有
-
构造方法的方法名必须和类名一致
-
构造方法不需要我们进行调用,当创建对象时会自动调用构造方法进行数据初始化
-
语法:权限控制修饰符 方法名(参数){方法体}
例:
public Code(){};
//无参构造
4.类和对象
对象
-
内存角度:封装数据的一种形式
-
代码角度:new的一个类的实例对象
Star st1=new Star(18);
-
人类认知角度:具体的个体就是对象,一切皆对象
类:对某个实物进行的客观描述
类就是根据某个事物,抽象出来的属性封装
对象是属性值的封装,代表某类的一个个体
根据不同的属性,封装不同的类
根据不同的属性值封装不同的对象
public class Student {
int id;//学号
String name;//姓名
char sex;//性别
String add;//住址
public Student(int id, String name, char sex, String add) {
this.id = id;
this.name = name;
this.sex = sex;
this.add = add;
}
}
5.静态变量和成员变量的区别
如果该属性是类对象共有的属性和值,定义为静态变量
如果该属性是类对象共有的属性,值可能不一样,定义为成员变量
如果该方法中有成员属性使用(直接使用,不需要对象),则该方法为成员方法(静态方法中不能直接使用成员属性)
如果该方法中不需要有成员属性使用,则该方法为静态方法
6.实例化
数据类型 变量名 = 值;
类,数组,接口
创建一个引用类型变量,保存一个类对象
Student s1 = new Student(10001,"张三1",'男',"石家庄");
- 相关类载入方法区
- new 会在堆内存开辟内存空间
- 调用构造方法,在栈内存开辟栈帧,执行沟通方法对堆内存空间的值进行初始化赋值
- 构造方法执行完之后,构造方法弹栈,把堆内存地址,赋值给变量s1
7.对象使用
创建一个引用类型变量,保存一个类对象
Student s1 = new Student(10001,"张三1",'男',"石家庄");
Student s2 = new Student(10002,"张三2",'男',"石家庄");
对象.属性
对象.方法(参数)
修改 对象直接的数据,相互不影响,修改s1 不会影响到s2,因为成员属性是对象独立保存的
s1.name = "李四";
查询
System.out.println(s1.name);
System.out.println(s2.name);
8.Bean
为对象定义属性(私有)和get,set方法的类叫Bean
public class User {
private String username;
private String password;
private String nickname;
public String getUsername() {
return username;
}
public void setUsername(String username) {
//当局部变量和成员变量名相同时,可以用this区分
this.username = 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;
}
//全参构造
public User(String username, String password, String nickname) {
super();
this.username = username;
this.password = password;
this.nickname = nickname;
}
//无参构造
public User() {
super();
}
}
9.常见异常
Exception in thread “main” java.lang.NullPointerException
// 创建用户对象
User user = new User("admin", "root", "管理员");
System.out.println(user.getUsername());
user = null;
// java.lang.NullPointerException
// 空指针异常 : 使用null值,访问成员属性时,会出现空指针异常,即找不到对象
System.out.println(user.getUsername());
10.对象调用静态属性
Star st1=new Star(18);
st1=null;
//虽然是null,但是可以访问静态变量,因为静态变量不在堆内存
System.out.println(st1.i);
Star st2=new Star(16);
Star st3=new Star(17);
//成员变量修改后,多个对象互不影响
st2.age=19;
System.out.println(st2.age);
System.out.println(st3.age);
//静态变量修改后,所有对象下的静态变量都会被修改
//如果是对象调用的静态属性,则在编译后会把对象转化为对应的类名去调用
st2.i=0;
System.out.println(st2.i);
System.out.println(st3.i);
System.out.println(Star.i);
class Star{
int age;
static int i=6;
public Star(int age){
this.age=age;
}
}
在进行反编译后变为:
Star.i = 3;
System.out.println(Star.i);
System.out.println(Star.i);
System.out.println(Star.i);
对象也变成了对应的类名
11.注意事项
11.1.静态调用成员
public static void main(String[] args) {
System.out.println(age);
}
会在编译时报错,即未运行之前(生成class文件之前)
11.2.传值和传引用
注意传递类型:传值(数值)传引用(地址)
11.3.常见异常
java.lang.NullPointerException:空指针异常
//创建用户对象
User user=new User("admin","admin","管理员");
System.out.println(user.getUsername());
// user=null;
// java.lang.NullPointerException 空指针异常
//使用null值访问成员属性时会出现空指针异常,即找不到该对象
System.out.println(user.getUsername());