Day07 类与对象、内存划分、构造器
- 面向对象
1.1 概述
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
面向对象简单举个例子来说就是我需要去做饭,我自己做饭这叫做面向过程,因为我自己要准备,自己要动手去做,但是如果我直接聘请一位厨师,那我就是面向对象,而厨师就需要面向过程,因为厨师要做具体的工作。
1.2 面向对象和面向过程
面向过程 : 侧重分步骤
比如做饭 :
1 买食材
2 开火
3 加水…放米…
4 熟了
面向对象 : 侧重分类/模块
比如做饭 :
找个厨师
厨师.买食材
厨师.开火
厨师.加水…方米…
面向对象和面向过程都是解决问题的思路,或者是程序设计范型,只是侧重点不同
面向对象的基础也是面向过程,只是面向对象把具体的实现细节给封装了,让外界无法直接获取
优点 :
易于维护、可扩展性、可重用性
1.3 构造器
1.3.1概述
构造器:1创建对象2初始化成员属性
1如果一个类中没有显示声明一个构造方法,则默认有一个公共的无参构造
2如果我们定义了构造方法,不管定义的是有参还是无参,则不会再有默认的无参构造
3构造方法重载:方法名相同,参数列表不同(个数不同或类型不同)
4语法:[权限修饰符]类名(参数列表){方法体}
5成员方法的方法名也可以和类型相同
6如何区分同名的成员方法和构造方法?看返回值,构造方法没有返回值(连void都没有)
1.3.2语法(简单的例子)
public class Constructor_01_1 {
// 指定一个有参构造
public Constructor_01(int i){
}
public static void main(String[] args) {
// 通过构造方法 创建对象
Constructor_01 c = new Constructor_01(2);
}
}
1.4 类和对象
1.4.1对象
1、代码角度: new的实例化某-个类的实例,用来保存特有的数据
2、数据角度:封装数据和逻辑的-种方式
3、现实生活角度:对象就是具体的某个事物,一-切皆对象
4、设计角度:从一个实际的实体抽象某些属性的一种实体表示
1.4.2 类
1、概念:是我们在思想上对某个东西,或者某-类东西的唯- 性标识 描述某-类的特征
是我们对客观事物描述的一个标准,一个模板
2、我们再抽离某个概念的时候就能建立相关事物的类-定是通过它的属性来形成这个概念通过这些属性可以形成对应的类通过不同的属性值形成不同的实体(个体/对象)
3、通过不同属性形成不同的类不同的属性值形成不同的对象
1.4.2.1案例
public class Student {
private int no;
private String name;
private boolean sex;
private int age;
}
1.5 实例化
实例化 :
Student s1 = new Student();
1、 载入对应的Student类到静态区
2、 new 会在堆内存创建对象空间,并把类中成员属性复制进去
3、 调用构造方法,创建对象并初始化内存空间中数据
4、 返回内存空间地址,赋值给变量 s1
1.6 类的构成
类中可以有什么
1、成员变量 : 类体中没有static修饰的变量,是每个对象共有的属性,保存在堆内存
2、静态变量 : 类体中加static修饰的变量,是每个对象共有的属性和值,保存在静态区
3、局部变量 : 方法内部的变量,如果多个方法需要访问相同的属性,则提升为静态/成员变量即可
4、静态方法 : 类级别的,通过类名访问
5、成员方法 : 对象级别,每个对象的方法
6、构造方法 : 用于创建类的实例 对象的方法
7、main入口方法 : JVM自动调用,程序入口,单入口
8、抽象方法 : 没有方法体,连大括号都没有,需要使用abstract修饰
9、静态语句块 : 没有名字的一个{} , 需要加static
10、动态语句块 : 没有名字的一个{} , 不需要加 static
11、this : 表示当前对象,相当于 我 一样,this不能出现在静态方法中
12、super : 表示父类
面向对象的特性:封装、继承、多态、抽象
1.7 常见异常
1、 java.lang.NullPointerException(空指针异常)
例如:
实例化一个对象
Star star = new Star();
Star=null;
此时运行控制台就会报出java.lang.NullPointerException这个错误,原因是使用null值,访问成员属性,就会报空指针异常,也就是找不到star中属性的地址。
1.8 构造方法重载
这部分就是根据实际需求来构造方法。
例如:
/**
*
-
@author GeneralHuge
-
@date 2021年3月30日
*/
public class Constructor_02_1 {public static void main(String[] args) {
Student stu01 = new Student(“张三”);
stu01.println();
}
}
class Student{
private String name;
private int age;// 需求 学生姓名不能为空
public Student(String name_){
if (name_ == null) {
name =“缺心眼子”;
}else{
name = name_;
}
}
public Student(String name_,int age_){
age = age_;
if (name_ == null) {
name =“名字不能为空”;
}else{
name = name_;
}
}public void setName(String name_) {
if (name_ == null) {
name = “名字不能为空”;
} else {
name = name_;
}
}public void println(){
System.out.println(“学生[ 姓名 : “+name+” , 年龄 : “+age+”]”);
}
}
1.9 JavaBean
JavaBean:
1、 变量私有化
2、 有对应的setter和getter方法,用于操作变量,且setter和getter方法可以快速生成
3、 分为无参构造和有参构造
4、 toString,equals,hashCode 等方法的覆写
案例:
public class Student {
private int no;
private String name;
private boolean sex;
private int age;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(int no, String name, boolean sex, int age) {
super();
this.no = no;
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
super();
}
public Student(int no, String name) {
super();
this.no = no;
this.name = name;
}
}