一、面向过程和面向对象
1.1、面向过程
强调的是我该怎么去做。即功能的执行过程,即先干啥,后干啥。在面向过程中,我们会写很多的函数,每一个函数负责完成某一个功能。
而一个主函数里面有多个小函数,需要完成某个功能的时候依次调用即可
由此我们发现面向过程的设计思想存在以下几个缺陷:系统软件适应性差,可拓展性差,维护性低。
1.2、面向对象
一种基于面向过程的新的编程思想,顾名思义该思想是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是我该让谁来做
面向对象最小的程序单元是类,必须先存在类的定义,再有对象,而具备某种功能的实体,称为对象
面向过程和面向对象的差别如下:
面向过程和面向对象各有千秋,面向对象更符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性,它拥有三大特征:
- 封装
- 继承
- 多态
二、变量
2.1、变量的分类
根据变量定义的位置的不同,我们大致可以把变量分为两大类:
- 成员变量:直接定义在类中,方法的外面,又称之为字段,不是属性
- 局部变量:除了成员变量外,其他变量都是局部变量,仅仅存在于方法内、代码块、方法的形式参数中
2.2、变量的初始值
变量的初始化表示在内存中开辟一个存储空间进行存储,只有初始化后才可以使用,不同的变量类型初始值不同
成员变量
默认是有初始值的,不同类型的初始值不同
数据类型 | 初始的默认值 |
byte、short、int、long | 0 |
float、double | 0.0 |
char | 一个空字符(空格) "\u0000" |
boolean | false |
引用数据类型 | null(表示不引用任何对象 |
局部变量
局部变量没有初始值,必须手动初始化才可以使用
2.3、变量的作用域
变量根据定义的位置不同,也决定了各自的作用域是不同的,关键是看变量所在的花括号的位置
成员变量
在所定义的类中都有效
局部变量
从开始定义的位置到花括号内有效,花括号外就无效了
2.4、变量的生命周期
变量的生命周期,通俗的来说就是变量在内存中可以存活多久
成员变量
成员变量是属于对象的,对象在堆内存中,所以成员变量也是存储在堆内存中的,随着对象的1消亡而消亡
局部变量
局部变量是存储在栈内存的,随着方法的调用的结束而消亡
局部变量是存储在方法中的,每次调用方法都会在栈空间开辟一个内存空间,我们成为栈帧,方法1调用结束,栈帧就被销毁了,内存中存储的变量数据也就销毁了
三、类
3.1、类的定义
类是拥有相同特性(状态)和行为(功能)的多个对象的抽象
- 使用成员变量来表示状态
- 使用成员方法来表示行为
格式
public class 类名{ //可编写0到N个成员变量 修饰符 数据类型 变量名1; 修饰符 数据类型 变量名2; //可编写0到N个成员方法 修饰符 返回值类型 方法名称(参数){ //方法体 } } 复制代码
注意:
- 成员方法和变量都不可以用static修饰,修饰符不是必须的
- 在描述对象的类中,不需要定义main方法,main方法在专门的测试类中编写,切测试类和描述对象的类是分开编写的
四、对象
4.1、对象的创建
类名 对象遍历名 = new 类名(); 复制代码
如果我们直接打印对象的话,打印的是类似数组地址的hashCode值
4.2、匿名对象
创建对象之后没有赋值给某个遍历,只能使用一次
new 类名(); 复制代码
4.3、给字段设置数据
对象变量名.字段名 = 值; 复制代码
4.4、获取字段的数据
数据类型 变量 = 对象变量.字段名; 复制代码
4.5、对象调用方法
对象变量名.方法(参数); 复制代码
4.6、对象实例化的内存分析
以下面简单地Cat类进行分析
public class Cat(){ String name; int age; } 复制代码
创建对象
Cat cat = new Cat(); 复制代码
此时如果通过查看对象的name和age属性可以发现分别为初始值null和0
给对象赋值
cat.name="xiaolin"; cat.age=18; 复制代码
对象调用方法
public class Cat(){ String name; int age; public void say(){ System.out.println("我们一起学猫叫"); } } 复制代码
五、构造器(构造方法)
5.1、构造器的定义
构造器,也称之为构造方法(Constructor),作用是用来创建对象和给对象做初始化操作,只能在创建对象的时候使用一次
构造器的语法
public 类名(参数){ //方法体 } //示范: public class Cat { public Cat() { } //省略其他代码 } 复制代码
构造器的特点
- 构造器名称和类名相同
- 不能定义返回类型
- 构造器中不能出现return语句
5.2、默认构造器
我们在创建类的时候,没有手动写构造器,而没有报错,原因是因为如果我们在编写对象的时候,如果没有写构造器的话,编译器会在编译源文件的时候,自动创建一个默认构造器,默认构造器的特点:无参数、无方法体。
如果类使用了public修饰,那么他默认的构造器也会使用public修饰,反之亦然
5.3、构造器的使用
没有构造器之前
之前,我们是先通过一个默认参数构造器,先创建出一个对象再初始化(给字段设置值)
Cat cat = new Cat(); c.name = "xialin"; c.age = 18; 复制代码
有了构造器之后
有了构造器之后,可以直接通过构造器同时完成对象创建和初始化操作
public class Cat { String name; int age; public Cat(String name, int age) { this,name = name; this.age = age; } void say() { System.out.println("我是" + name + ",今年" + age + "岁"); } } 复制代码
Cat cat = new Cat("zs", 19); cat.say(); Cat cat = new Cat(); // 此行报错 复制代码
当自己定义出构造器之后,编译器不再创建默认的构造器了,所以就不再自动有无参构造器,我们一般在开发中无参构造器和有参构造器会同时编写,他们构成重载关系
public class Cat { String name; int age; //无参数构造器 public Cat() { } //带参数构造器 public Cat(String name, int age) { this,name = name; this.age = age; } //其他代码 } 复制代码