Java 面向对象1
类和对象
- 面向对象
- 关注现实存在的事物的各方面信息,从对象的角度出发,根据事物的特征进行程序设计
- 对象:用来描述客观事物的一个实体
- 类:具有相同属性和方法的一组对象的集合
- 属性
- 对象具有的各种静态特征
- “对象有什么”
- 方法
- 对象具有的各种
- “对象能做什么”
- 在方法中通过对象作为参数,传递的是它的引用,可以通过引用获取该对象的所有信息。
- 类
- 抽象的概念
- 模板
- 类是模子,确定对象将会拥有的特征(属性)和行为(方法)
- 类是对象的类型
- 构造方法
- 注意事项
- 构造方法与类同名且没有返回值(必须与类名相同)
1
2
3
4
5// 构造方法的语法格式:
// 没有返回值类型 , 构造方法名 与类名相同
public 构造方法名(){
// 初始化代码
} - 只能在对象实例化的时候调用
- 构造方法与类同名且没有返回值(必须与类名相同)
- 特点
- 当没有指定构造方法时,系统会自动添加无参的构造方法
- 当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
- 一个类中可以有多个构造方法
- this(); 访问其它无参或带参 构造方法
- 注意事项
- this 关键字
- this:当前对象的默认引用
- this 的使用
- 调用成员属性,解决成员属性的局部变量同名冲突
- 调用成员方法
- 调用重载的构造方法 this();
- 通过 this() 调用构造方法,必须放在方法体内的第一行!!!
- 对象
- 基本概念
- 一个看得到、摸着着的具体实体
- 对象是类的实例表现
- 万物皆对象
- 对象是特定的类型数据
- 对象实例化
- 实例化对象过程可以分为两部分
- 声明对象 Class 对象名称
- 在内存的栈中开辟一个空间,此时栈空间的数据是空的
- 实例化对象 new Class
- 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
声明对象和实例化对象通过 = 赋值符号完成。经过赋值操作,将内存的堆地址,传递到栈当中的内存空间里。
- 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
- 声明对象 Class 对象名称
- 内存分配 栈[局部变量] ,堆[动态数据]
- 实例化对象过程可以分为两部分
- 注意事项
- 需要多次访问同一对象时,必须进行声明
- 同一作用范围内,不能定义同名对象
- 可以同时声明多个引用,用逗号分割
1
2
3
4Cat one,two;
one = new Cat();
two = new Cat();
Cat three = new Cat();four = new Cat();
- 基本概念
封装
- 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
- 隐藏对象的信息
- 留出访问的接口
- 特点
- 只能通过规定的方法访问数据
- 隐藏类的实例细节,方便修改和实现
- 实现步骤
- 1、修改属性的可见性 ,设为 private
- 2、创建 getter/setter 方法 ,设为 public 用户属性的读写
- 3、在 getter/setter 方法中加入属性控制语句,对属性的合法性进行判断
- 包(类似文件夹)
- 作用
- 管理 Java 文件
- 解决同名文件冲突
- 定义包
- 语法 package 包名;例:package com.zje.animal;
- 注意
- 一个 Java 源文件只能有一个 package 语句,必须放在 Java 源文件中的第一行
- 包名全部英文小写
- 建议每个包内存储信息功能单一
- 包命名规则:域名倒序+模块+功能
- Java 中一个包不能存在同名类
- 导入包
- 语法 import 包名.类名;
- 导入包中全部类 import com.xxx.*; 导入包中指定类 import com.xxx.animal.Cat;
- 常用系统包
- java.lang
- 包含 Java 语言基础的类,该包系统加载时 默认导入。如 System、String、Math
- java.util
- 包含 Java 语言中常用工具。如 Scanner、Random
- java.io
- 包含输入、输出相关功能的类。如File、InputStream
- java.lang
- 问题
- 如何实现跨包的类调用?
- 建议采用“import 包名.类名;” 的方式加载,提高效率
- 加载类的顺序跟 import 导入语句的位置无关
- “import 包名.*”; 无法访问指定包名下的类,无法访问子包下的类
- 有几种调用形式?
- 使用 import 语句导入目标类:这种方式可以直接在代码中使用 TargetClass 而无需指定完整的包路径。
import com.example.targetpackage.TargetClass;
- 使用完整的包路径访问目标类:这种方式需要在代码中完整地指定目标类的包路径。
com.example.targetpackage.TargetClass targetObject = new com.example.targetpackage.TargetClass();
- 使用 static import 导入目标类的静态成员:这种方式可以直接访问目标类的静态成员,无需指定类名。
import static com.example.targetpackage.TargetClass.staticMethod; staticMethod(); // 直接调用静态方法
- 使用 default 访问修饰符允许同一个包下的类进行访问:这种方式需要将目标类的方法声明为 default 访问修饰符,这样同包下的其他类就可以访问该方法。
// com.example.targetpackage.TargetClass default void defaultMethod() { // 此方法可被同包下的其他类访问 }
- 如何实现跨包的类调用?
- 作用
- static 关键字
- 1、类对象共享
- 2、类加载时产生,销毁时释放,生命周期长
- 注意事项
- 在成员方法中,可以直接访问类中的静态成员
- 静态方法中不能直接访问非静态成员,只能直接调用静态成员
- 只能通过对象实例化后,对象.成员方法的方式访问非静态成员
- 静态方法中不能使用 this
- 静态成员访问方式
- 1、对象.成员
- 2、类.成员
- 代码块
- 普通代码块:每此调用方法 顺序执行,先出现,先执行。
- 构造代码块:在类中定义,创建对象时调用,优先于构造方法执行。可以有多个
- 静态代码块
- static { <语句> }
- 类加载时调用,优先于构造代码块执行
- 无论产生多少类实例,静态代码块只执行一次,构造代码块在每次对象构造的时候调用
成员属性的初始值
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘\u0000’ |
boolean | false |
引用类型对象的初始值 | null |