面向对象
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
对象
万物皆对象,客观存在的事物都是对象
类
什么是类
类定义了一种抽象数据类型
类就是模板,确定对象将会拥有的特征(属性)和行为(方法)
类的特点
类是对象的类型
具有相同的属性和放到的一组对象的集合
什么是对象的属性
属性:对象具有的各种特征,每个对象的属性有具有特定的值,可以理解为对某类事物的描述
例如:狗类
属性:品种、尺寸、颜色、年龄
注意:对象的属性既具有默认值,这个默认值与相对的类型相关
数据类型 默认值
byte 0
short 0
int 0
long 0
double 0.0
float 0.0
char 空字符
boolean false
String null
什么是对象的行为
方法:对象执行的操作
类和对象的关系
类是对象的抽象,仅仅是一个模板,在现实世界中是不存在的;而对象是具体的实例,是类这个模板的具体实例。
类的声明和实例化
类名 对象名 = new 类名();
变量作用域
在一个方法中无法读取另外一个方法中声明的变量声明在方法中的变量我们称之为局部变量
声明在方法外的变量我们称之为成员变量
当读取的变量在局部代码中不存在则取找成员变量
static 修饰的成员变量的值是被该类中的所有方式所共享
static只能修饰成员变量不能修饰局部变量
static修饰的方法称之为静态方法反之称之为非静态方法或普通方法我们平时说的方法一般之的是非静态方法静态方法只能访问静态成员变量
成员变量和局部变量
成员变量 在类中定义,用来描述对象将要有什么
局部变量 在类的方法中定义,在方法中临时保存数据
-
同名变量不同
-
在同一个方法中,不允许有同名的局部变量
-
在不同的方法中,可以有同名的局部变量
成员变量和局部变量的区别
作用域不同
-
-局部变量的作用域仅限于定义它的方法
-
-成员变量的作用域在整个类内部都是可见的
初始值不同
-
-成员变量有默认的初始值
-
-局部变量没有默认的初始值,必须自行设定初始值
存储位置不同
-
-成员变量是在对象创建以后存在于堆中,对象回收时,成员变量消失
-
-局部变量是在方法被调用时存在于栈中,方法调执行结束,从栈中清除
生命周期不同
-
-对象的创建而创建,对象回收时,成员变量消失
-
-随着方法的调用被创建,方法执行结束,从栈中清除
权限修饰符
访问修饰符 public protected default private
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
- public:对所有类可见。使用对象:类、接口、变量、方法
- protected:对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private: 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- 外部如何访问内部的私有成员变量 适用本类中的共有方访问本类中的私有成员变量
lombok注解自动生成 Setter 和Getter
构造方法
方法名与类名相同 方法体没有返回值但是在方法声明的时候却不需要使用void修饰的方法我们称之为构造方法
- 构造方法的作用 用于初始化对象 对象的属性赋值
- 没有参数的构造方法我们称之为无参构造方法
- 代码中没有编写过构造方法 jvm在执行对象初始化的时候帮助程序追加无参构造方法
- 注意当一个类中 既没有无参构造方法也没有有参构造方法的时候jvm会追加一个无参构造方法
- 但是当一个类中 存在有参构造方法没有编写无参构造方法的时候jvm不会追加无参构造方法
- 所以不论在任何情况下一定要自己手写有一个无参构造方法
- 花括号包裹起来的代码我们称之为代码块或代码段
- 只有一对花括号包裹起来的代码我们称之为构造代码块
- 构造代码块与构造方法一样都是在类被实例化的过程中被调用的
- 并且构造代码块在构造方法之前先执行
- 类每次被实例化的过程中都会调用构造代码块
- 使用static修饰的构造代码块我们称之为静态代码块
- 当类加载的时候执行静态代码块 而且静态代码块 仅执行一次 不可多次执行
- 而构造代码块是在类实例化的过程中执行的
- 执行优先级 静态代码块—>构造代码块—>构造方法
无参构造方法
public 方法名(){
System.out.println("无参构造方法")
}
有参构造方法
public 方法名(String name, int age){
this.name =name;
this.age=age;
}
this调用构造方法只能放在第一行
this调用方法不能相互调避免死循环
执行顺序是静态>代码块>构造方法
public static void eat() {
System.out.println("我是静态方法eat()");
}
{
System.out.println("我是构造代码块");
}
static{
System.out.println("我是静态代码块");
}