万物皆对象,类也是一个对象【反射的知识点】
空即色 色即空
面向对象中有一个特殊的对象:null [空对象]
空即万物 万物即空 - 也就是说任意类型对象都可以指向null
案例:
盘古【null】开天劈地 【空生万物】
2.this关键字
案例:
创建一个人类
有属性:姓名 年龄性别
功能:吃饭
要求写构造方法【无参和有参的】
成员变量和局部变量重名时
优先选择局部变量
如果想给成员变量赋值 在成员变量前用this.修饰
this的含义:
当前类对象的引用。
一个类有多个对象,this到底代表哪个对象呢?
哪个调用方法 this就代表该对象
this在成员变量(在类中方法)调用时 默认是隐藏的
什么情况下显示使用this??
当成员变量与局部变量重名时 显式使用this
this的练习:
在学生类中有一个功能:比较两个学生的年龄是否相同
this在构造函数间的使用
构造函数的作用是:给对象的属性初始化的
构造函数也是一个函数,函数就是一个功能的封装 当需要该功能的时候 就直接调用函数即可。由于构造函数的特殊性,不能直接使用构造函数名来调用 这个时候就是用this来辅助
辅助: this([传参]);
需要传参的时候传参
没有参数的时候调用的是无参的构造方法 - this();
【注意:使用this调用构造函数时 这条语句必须位于第一句】
练习:
创建一个动物Animal类
类中属性: 品种 年龄 性别 毛色
功能: 叫 吃
构造方法:有一个无参的 【为每个属性赋默认值】
有一个具有三个参数的【品种 年龄 性别】
有一个给所有属性赋值的
在测试类中
使用者三个构造方法分别创建 品种为:猫 狗 老虎的对象
调用叫 和 吃的方法
3.面向对象的特性之一 - 封装
面向对象有三大特性:封装 继承 多态。 继承是多态的前提
封装(Encapsulation):
指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
生活实例:
吃饭: 面向对象【找饭店满足需求】
饭店做饭时 :
买菜
洗菜
切菜
炒菜
这些操作对于吃饭的人来说 没有必要了解 所以在饭店中有厨房的地方 把以上操作隐藏
java程序中所说的封装是:将对象的属性私有化,对外提供对应的公共的set和get方法即可
【set - 设置 - 为属性赋值】
【get - 获取 - 获取属性的值】
案例:
设置人的年龄
封装:
将对象的属性私有化
就是在属性前添加访问权限修饰符private(私有的)
当对一个属性添加访问权限修饰符后,该属性只能在本类中使用
如果想在外界对私有的属性赋值 或者 获取对应的值
---> 对外提供公共的set和get方法
set方法格式:
---> 通过外界赋值 == 需要外界传参
public void set属性名(属性类型 变量){
为对应的属性赋值
}
例如:给name属性赋值
public void setName(String name){
this.name = name;
}
get方法的格式
---> 外界获取该属性的值 == 这个方法需要有返回值
public 属性类型 get属性名(){
return 属性;
}
例如:获取name属性的值
public String getName(){
return name;
}
4.封装的好处
封装的好处: 降属性私有化之后 可以提供对应的赋值和取值的方法,当赋值不符合实际逻辑时,可以在赋值的方法(set方法)中加入自己的逻辑判断,这种操作提高了代码的健壮性,以及数据的安全性
5.set方法和构造函数的使用
使用人设置年龄的案例
如果想通过有参的构造方法创建对象,
有参的构造方法创建对象
通过方法的调用 将数据传到对应的类中 在该类中对属性进行赋值的 外界并没有直接操作对象的属性,所以可以赋值成功。为了避免赋值的随意性,在有参的构造方法中调用赋值的set方法对属性进行赋值
6.封装的练习
设置一个学生类Student
属性:姓名 学号 成绩
利用封装特性 对学生类进行封装 并在测试类中创建学生对象 打印学生信息
将属性私有化的关键字:private 公共的关键字public
7.static关键字
static是一个静态修饰符,可以修饰成员变量,也可以修饰成员方法
static修饰的变量放在静态域中
7.1 使用static修饰成员变量
用static修饰的成员变量称之为静态变量
使用场景:
当该类的每个对象的某属性值都一致时,为了节省内存空间,可以使用static修饰该属性。
对象的属性是跟随着对象放在堆中。static修饰的变量放在静态域中,这个变量属于类,被所有对象所共享.
案例:
Person
姓名 年龄 国籍(CH)
【了解】在静态域中的变量 一旦被赋值 将永久持有该值,一直到被修改或者程序终止
静态变量的调用:
调用方式有两种 对象的引用变量.静态变量
或者 类名.静态变量 【经常使用的】
为什么经常使用类名调用静态变量 而不是使用对象引用变量来调用????
创建对象的时候 类已经存在了 静态变量是直接可以由类来调用的,如果再因为调用静态变量而创建一个对象去占用堆的空间 【浪费内存了】
7.2 使用static修饰方法
这种形式常见于工具类 Math Arrays
自己制作一个工具类
工具类中的功能:
比较两个数的大小
数组进行降序排序
7.3 static修饰符的特点
a. 静态的内容是随着类的加载被加载到内存中的
b. 静态内容的加载时机优先于对象
c. 可以直接通过类来调用
7.4 static的注意事项
在静态的方法中只能使用静态的内容,不能直接使用非静态内容
原因: 在静态方法中使用了在内存中不存在的内容
8.main方法
main也是一个类中的静态方法,只不过这是一个特殊的方法,调用者不由我们控制,而是有虚拟机完成的
main方法的格式是固定的
public static void main(String[] args)
方法被调用的时候 如果有参数 是必须得传参的
猜想:当虚拟机调用main方法时 传递的是什么参数???
// 通过接收者来看一下 虚拟机调用main函数时 传的参数是什么?
System.out.println(args.length); // 0
// 长度是0 代表传进来的是一个长度为0的数组
//String[] arr = new String[0];
/*
有没有办法对main函数进行传参???
有
java 运行程序的时候
控制台指令 java
作用:调用虚拟机运行程序
运行哪个程序 ---》 java 程序名 参数 参数
java Main 嘻嘻 哈哈 嘎嘎
*/
System.out.println(Arrays.toString(args));
9.static练习
设计一个表示用户的User类,类中的变量有用户名、记录用户个数的变量‘ 定义类的构造方法(无参、为用户名赋值),创建几个对象 统计对象的个数
10.代码块
代码块的分类
普通代码块
位于方法体中 【一般不用】 表现形式
void method(){
{
普通代码块
}
}
构造代码块
位于类中的
class 类名{
{
// 构造代码块
}
}
静态代码块
位于类体中
class 类名{
static{
// 静态代码块
}
}
构造代码块
作用:与构造函数相同 - 为对象属性进行初始化
与构造函数的区别:
构造代码块是为该类的所有对象进行统一初始化的
有参的构造函数仅是给当前对应对象初始化的
构造代码块的执行时机:
对象一建立(new)就被执行了 而且 执行时机优先于构造函数
静态代码块
作用:
如果某些内容只需要加载一次,那么这个内容可以放置在静态代码块中[第二阶段 加载JDBC的驱动类时]
静态代码块是随着类的加载而加载的,执行时机优先于main函数,而且静态代码块只会被执行一次