JAVA面向对象基础--面向对象介绍
一、面向过程 & 面向对象
1.面向过程
- 步骤清晰简单,第一步做什么,第二步做什么等等
- 面对过程适合处理一些较为简单的问题
2.面对对象思想
- 物以类聚,分类的思维模式。(分类细分解决问题)
- 思考问题首先会解决问题需要哪些分类
- 然后对这些分类进行单独思考
- 最后,对某个分类下的细节进行面向过程的思索
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
注意:对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
二、什么是面向对象
- 面向对象编程(Object-Oriented Programming,OOP)
- 面向对象编程的本质是:以类的方式组织代码,以对象的组织(封装)数据
- 从认识论的角度是先有对象后有类
- 对象:具体事物
- 类:抽象的,是对对象的抽象
- 从代码运行角度是先有类后有对象
- 类是对象的模板
三大特性:
- 封装:比如将一个东西装起来只留一个进出的口
- 继承:父子关系
- 多态:比如,不同的人使用一种方法会产生不同的效果
三、类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不代表某一个具体的事物
-
一个类中只有属性和方法
-
比如:动物、植物、手机、电脑....都是一种抽象的类型
-
Person类、Pet类、Car类,这些都是同来描述/定义某一类具体的事物应该具备的特点和行为
- 对象是抽象概念的具体事例
- 张三就是人的一个具体事例,张三家里的旺财就是狗的一个具体事例
- 能够体现出特点,展现出功能的是具体的事例,而不是一个抽象的概念
四、创建与初始化对象
使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行初始化赋值以及对类中构造器的调用
- 类中的构造器也称为构造方法,是在进行创建对象时必须要调用的,并且构造器有以下两个特点
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
- 注意:构造器必须掌握
举例:
注意:以类的方式组织代码,以对象的方式封装数据
- 创建一个Student类,作为模板
//学生类
//以类的方式组织代码
public class Student {
String name;//属性1:姓名,默认值为null
int age;//属性2:年龄,默认值为0
//方法
public void study(){
System.out.println(this.name+"在学习");
}
}
- 再创建一个类,用于编写具体代码
public class Appliance {
public static void main(String[] args) {
//类:抽象的,需要实例化
//类实例化后会返回一个自己的对象
//xiaoming、xiaohong就是Student类的具体事例
Student xiaoming = new Student();
Student xiaohong = new Student();
//赋值
//以对象的方式封装数据
xiaoming.name = "小明";
xiaoming.age = 18;
xiaohong.name = "小红";
xiaohong.age = 17;
//输出
System.out.println(xiaoming.name+"\t"+xiaoming.age+"岁");//输出 小明 18岁
System.out.println(xiaohong.name+"\t"+xiaohong.age+"岁");//输出 小红 17岁
}
}
五、构造器(必须掌握)
构造器的作用:
-
使用new关键字,本质是在调用构造器
-
用来初始化值
举例:
- 创建一个Person类
public class Person {
String name;//name属性
//构造器的作用:
// 1.使用new关键字,本质是在调用构造器
// 2.用来初始化值
//默认构造器
//无参构造:默认不显示
public Person(){
this.name = "Lisi";
}
//重载构造器
//有参构造:一旦定义了有参构造,无参构造就必须显示定义
public Person(String name){
//this.name中的name是指上面的name属性
//等号右边的name是指有参构造中的参数name
this.name = name;
}
}
注意:
- 无参构造器是默认不显示的(不显示但存在,同class文件可以看到),所有当一个类中什么都没有的时候,在main方法中也可以实例化一个对象
- 定义了有参构造器时,无参构造就必须显示定义(即手动定义),否则无法实例化对象
- 创建另外一个Appliance类,并加上main方法
public class Appliance {
public static void main(String[] args) {
//new 实例化了一个对象
Person person = new Person();//调用的是无参构造器,默认值为null,但无参构造器中初始化了,则输出初始化的值
Person person1 = new Person("Zhangsan");//调用的是有参构造器
System.out.println(person.name);//输出Lisi
System.out.println(person1.name);//输出Zhangsan
}
}
生成构造器的快捷键:
- Alt+Insert:自动生成构造器(笔记本电脑没有反应则按:Fn+Alt+Insert)
- 点击Constructor
- 选择有参无参即可
六、创建对象内存分析
创建了一个Pet类如下:
public class Pet {
//属性
String name;
int age;
//方法
public void shout(){
System.out.println("叫了一声!");
}
}
再创建一个包含main方法的类进行具体操作如下:
public class Appliance {
public static void main(String[] args) {
//对象1
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();
//对象2
Pet cat = new Pet();
}
}
对以上代码进行内存分析
简易内存描述如下:
- new了一个dog对象后内存变化如下:
Pet dog = new Pet();
- 给dog对象赋值后,变化如下:
dog.name = "旺财";
dog.age = 3;
dog.shout();
- new了一个cat对象后内存变化如下:
Pet cat = new Pet();
七、小结
- 类与对象:
- 类是一个模板,是抽象的
- 对象是一个具体事例
- 对象的应用:
- 引用类型:八大基本类型
- 对象是通过引用来操作的:栈-->堆
- 属性:字段Field 成员变量
- 默认初始化:
- 数字:0 或 0.0
- char:u0000
- boolean:false
- 引用:null
- 对象的创建与使用
- 必须使用new 关键字创造对象
- 必须掌握构造器
- 对象的属性:对象.属性名;
- 对象的方法:对象.方法名();
- 类:
- 静态的属性:属性
- 动态的行为:方法