匿名对象以及对象的生命周期
匿名对象引入
class _05NiMinDuiXiang{
public static void main(String[] args) {
new Student().name = "老狗";
System.out.println(new Student().name);//null
}
}
class Student{
String name;
int age;
void eat(){
System.out.println("哈根达斯......");
}
}
因为上面new了两次;在堆空间了创建了两个对象,值赋值给第一个对象;
这里的对象 new Student() 其实就是匿名对象;
什么是匿名对象
- 匿名对象的概念:
1.匿名对象,就是没有名字的对象[创建了一个对象而没有使用变量接收]
2.该对象存在于堆总处于游离状态:没有任何变量持有引用地址,指向他
3.但是匿名对象本质也是一个对象v
匿名对象使用场景
class _05NiMinDuiXiang{
public static void main(String[] args) {
new Student().eat();
}
}
class Student{
String name;
int age;
void eat(){
System.out.println("哈根达斯......");
}
}
- 把匿名对象作为一个实际参数进行传递
class _05NiMinDuiXiang{
public static void main(String[] args) {
print(new Student());//匿名对象作为参数传递
}
static void print(Student stu){
System.out.println("呆看我一调.....");
}
}
class Student{
String name;
int age;
void eat(){
System.out.println("哈根达斯......");
}
}
- 对对象的生命周期的了解
开始 : new Student() new的时候就开始了;
结束
[说法1,常见的说法] :当对象失去所有的引用
[没有变量再指向它了(没有变量在存储它的地址)- 相当于失联了,我们无法再使用它了]
结束
[说法2] : 对象真正的被销毁[对象会在堆里面占用内存,当把对象的内存空间回收了]
Java有自动垃圾回收机制;
static关键字 静态的 修饰符
- static引入及修饰内容测试
1.这是从第一次写hello的时候,就见过;
2.static 是Java的一个关键字,也是一个修饰符;
3.可以修饰什么和不可以修饰什么?
4.目前java代码中存在的东西 分析static是修饰符:可以修饰的内容:及验证
(1)可以修饰普通方法
(2)可以修饰字段[ 成员字段 ]
(3)可以修饰内部类[暂时不了解]
(4)不可以修饰外部类
(5)不可以修饰局部变量;
(6)不可以构造方法
修饰方法:如何使用?
有static修饰的方法: 方法所在的 类名.方法名(…);
public static void main(String[] args) {
Student.eat();
}
class Student{
static void eat(){
System.out.println("薯片");
没有static修饰的方法 : 方法所在的类的对象名.方法名(…);
public static void main(String[] args) {
new Student().eat();
}
class Student{
void eat(){
System.out.println("薯片");
}
}
static修饰字段有什么效果?
- 在写一个字段的时候,是否应该加static —> 根据实际情况
- 实际情况:设计一个学生类,其中有name-姓名 字段,是否应该加static 呢? —> 加与不加的效果
验证使用static修饰字段之后的效果
1.效果:加了static修饰的字段:该字段被该类所有对象共享:当一个对象修改了该字段,其他对象使用该字段,都是修改之后的值
static修饰方法有什么效果
- 目的: 使用static修饰的方法调用方便
- 常见的地方: 一般就是工具方法【关注方法本身的功能】,例如: Arrays中全部都是工具方法(static)
最近面向对象语法,我们一般写的方法都写成非静态,除非非得使用static
static类级别的修饰符
- static类级别的修饰符理解
(1)static修饰的字段:应该通过类名.字段名访问
(2)static修饰的字段:应该通过类名.方法,该字段被该类的所有对象共享对象级别
(1)非static修饰的字段:对象名.字段名
(2)非static修饰的字段及方法,当创建对象时候,独属于每一个对象,没有被该类的对象共享
Student stu1 = new Student();
stu1.name = "小花花";
Student stu2 = new Student();
stu2.name = "大花花";
静态上下文不予许访问非静态的变量及方法
非静态上下文可以访问静态上下文:
class Student{
static String name;
static void eat(){
System.out.println("吃学习......");
}
int age;//对象级别
void run(){//对象级别
System.out.println("顺拐.......");
包
什么是包
- 包
package)是Java提供的一种区别类的名字空间的机制,是类的组织方式,是一组相关类和接口的集合,它提供了访问权限和命名的管理机制
包作用
- 包命名规范:一般是 公司域名 反过来写 + 项目名+模块名字+子模块名
例如 : itsource.cn 域名
语法 : package cn.itsource.erp.oa.domain; - 注意:不要写错nc.
上班之后 不要写错cn.itsource 按照公司规范写 - 规范及实际书写注意事项规定
1.规范
a)自己一定需要有规范命名的意识,具体怎么写以公司标准为准;
b)包名中应该全部都是英文,并且是小写的
包的导入
包的导入(其实本质是导入包中的类到本类中,确保本类中可以正确的使用到指定的类型)
1.在一个类中需要使用到其它的包中的类,可以先导入在便捷的使用
2.目的: 是为了正确的引用到指定的类型
3.注意: 导入包的代码应该在声明包的后面,声明类的前面
- 导入的语法 :
1)import 包名.子包名.类名;
2)import 包名.子包名.*;//*通配符,通配该类所在的子包名
3)通一个类中用到了java.util.Date java.sql.Date 导入会区别不了二异,所以通过完全限定名的方式使用
4)java.lang这是Java规定的核心包,使用的时候会自动导入,所以不用手动导入
封装
- 封装概念
通过封装的操作,可以达到从物理层面控制访问(外面不能轻易访问到里面内容–》这个就是物理层面)
Java中的封装如何体现
- 如何控制程序中的访问 ?
通过给类中的成员(字段,方法,构造方法)添加访问权限来实现访问控制 - 什么是访问权限:
例子:比如做一个系统,不同人登录进去,的访问权限不一样; - 访问权限修饰符: private < 默认不写(注意不要添加default修饰)< protected < public
private :最小权限,被它修饰的成员只能够在本类中可以访问到;
public :最大权限,任何地方和任何人都能访问; - 为什么需要将字段私有化起来: 安全
封装的步骤
1.上面的代码把name age 私有化 [提供private 修饰 ]之后就不能够操作了,
2.怎么去赋值和取值呢?提供setget方法
3.提供一个无参数的构造方法:标准的javaBean
/*
设计方法存值取值
public 需要,给别人访问的
static 不需要:修饰方法,字段也需要静态修饰,静态修饰的字段被该类的所有对象共享
返回值:存值void 不需要返回值,取值对应字段类型
方法名字:存值setName 取值getName : 特殊情况 布尔类型的字段get 变 is
参数:存值对应字段类型,取值不需要参数
*/
class Student{
private String name;
private int age;
private boolean sex;
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
public void setAge(int a){
age = a;
}
public int getAge(){
return age;
}
public void setSex(boolean s){
sex = s;
}
public boolean isSex(){
return sex;
}
}
封装小结
- 在Java 中的体现及步骤
1)把类中的字段私有化;
2)给每一个字段都提供一组getter setter方法 (方法的规范写法);setXxx
在测试类中尝试创建对象,并通过调用getter setter方法完成 对字段的赋值和取值;
3)提供一个无参数的构造方法 - 能否把一个字段的get 和set方法写成一个方法
i.不可取(比如 当我只是取值的时候,还需要传入参数,这不好) - 一个类中的多个字段的赋值方法 写成一个方法
i.不可取 耦合度太高(万一我们只想给某一个字段赋值) - 单一职能原则:功能最小化,不要想着一个方法写完所有的功能
- JavaBean
1)字段必须私有化
2)给每一个字段提供合理的getter setter方法
必须有一个公共的无参数的构造方法;