面向对象编程(OOP)
初识面向对象
面向过程&面向对象
面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么
- 面对过程适合处理一些较为简单的问题
面向对象思想
- 分类的思维模式,思考问题首先解决需要哪些分类的问题,然后对分类进行单独思考,最后,才对某个分类下的细节进行面向过程的思考
- .面向对象适合处理复杂的问题,适合处理需要多人协作的问题
对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是,具体到微观操作,任然需要面向过程的思路去处理。
什么是面向对象
- 面向对象编程,即Object-Oriented Programming,OOP
- 面向对象编程的本质就是:以类的方式组织代码,以对象的方式封装数据
- 面向对象是抽象的
- 面向对象三大特性(这些我们会在后面的学习中慢慢总结)
- 封装
- 继承
- 多态
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物,类,是抽象的,是对对象的抽象
- 从代码运行角度考虑是先有类后有对象,类是对象的模板。
方法的回顾和加深
方法的定义
修饰符
- public:表示公共的,可以被本包和其他包使用
- static:静态的,使方法与类一同加载
返回类型
及方法体执行后的返回值的类型
如果无返回值,可以写为return;或者不写return 语句
方法名
- 以驼峰原则命名
- 要求见名知意
参数列表
即参数类型、个数、顺序等
异常抛出
这个问题我们会在以后讲
先看一下格式就行
public void readfile(String file) throws IOException{
}
(目前我们已经遇到过数组下标越界的问题)
方法的调用
非静态方法
先实例化再调用
静态方法
你们会不会好奇我这个界面是怎么弄的,这么方便,其实很容易,上图:
两者的差别
先看几段代码
该代码在idea中未报错
public class Demo01 {
public static void main(String[] args) {
}
public void a(){
b();
}
public void b(){
}
}
该代码在idea中也未报错
public class Demo01 {
public static void main(String[] args) {
}
public static void a(){
b();
}
public static void b(){
}
}
这个代码确报错了
public class Demo01 {
public static void main(String[] args) {
}
public static void a(){
b();
}
public void b(){
}
}
为什么呢?
因为static修饰的方法是和类一起加载的,而无static修饰的方法是在实例化之后才存在的
形参和实参
我们在代码中分析形参和实参
public class Demo01 {
public static void main(String[] args) {
int add=Demo01.add(1,2);
}
public static int add(int a,int b){
return a+b;
}
}
在这段代码中,a,b起到接收1,2两个值的作用,并不是实际存在的变量,叫做形参
public class Demo01 {
public static void main(String[] args) {
int a=1;
System.out.println(a);//输出1
change(a);
System.out.println(a);//输出1
}
//无返回值
public static void change(int a){
a=10;
}
}
两个输出皆为1,因为change方法中的a不是实际的参数
值传递和引用传递
上面的那段代码就是值传递的示例
而对引用传递:
注意:一个Java文件里可以有多个class,但只能有一个public class
import java.sql.SQLOutput;
//引用传递:对象,本质还是值传递
public class Demo01 {
public static void main(String[] args) {
Person person=new Person();
System.out.println(person.name);//null
change(person);
System.out.println(person.name);//wqy
}
public static void change(Person person){
person.name="wqy";
}
定义了一个Person类,有一个name属性
static class Person{
String name;//null
}
}
this关键字
//学生类
public class Student {
//属性:字段
String name;//null
int age;//0
//方法
public void study(){
System.out.println(this.name+"在学习");//这里的this.name指向值为null的name
}
}
以后还会更深入的讲解this
对象的创建分析
类与对象的关系
- 类是一种抽象的数据类型,它是对某一事物的整体描述/定义,但是不能代表某一个具体的事物。
- 动物、植物、手机、电脑…
- Person类,Pet类,Car类,这些类都可以定义、描述某一类具体的事物具有的特点和行为
- 对象是抽象概念的具体实例
- 张三就是人的一个具体实例
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念
创建与初始化对象
- 使用new关键字创建对象
- 使用new创建对象时,除了分配内存空间外,还会给创建的对象进行默认的初始化以及对类中构造器的使用
- 类中的构造器也称为构造方法,是创建对象时必须要调用的,并且构造器有以下两个特点:
- 必须和类的名字相同
- 必须没有返回值,也不能写void
代码演示
注意:一个项目中应该只有一个main方法。且在Student类中不能初始化name,age的值,否则该类中所有对象的值都将被规定
构造器
首先,我们先观察一个现象:
图中的Person是我们创建的一个类
打开项目结构:
添加内容根:
选择与我们创建的项目同级的out目录:
找到反编译生成的Person文件:
与原来的class文件对比,发现反编译形成的多了一段代码:
public Person(){}
它其实就是一个构造器
这告诉我们:一个类即使什么都不写,也会存在一个方法
我们也可以自己定义一个构造器:
这里也能用到this关键字:
还有一种有参数的构造器:
也可以定义有多个参数的构造器哦
构造器总结
- 特点
- 和类名相同
- 无返回值
- 作用
- new 本质在调用构造方法
- 初始化对象的值
- 快捷键:alt+insert新建构造器
选择生成构造函数
他会让你选择参数类型:
当然,你也可以点击无选择来新建无参数的构造器
注意点:定义有参构造器之后,如果使用无参构造,要显示无参构造的定义
Java中的内存讲解
推荐一篇文章:https://blog.csdn.net/qq906627950/article/details/81324825
因为很多东西我们还没学,可以以后慢慢看。