Java中类与对象的学习下
对象的创建和使用
- 创建对象语法: 类名 对象名 = new 类名()
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
//这是我们定义的Person类
class Person {
**上一个代码块的内容;**
}
//具体使用
public class PersonTest {
public static void main (String[] args) {
//创建Person类的对象(类的实例化)
Person p1 = new Person();//实例一个具体的人,变量名叫p1
p1.name = "小明";//创建类时,name这个变量我们没有赋值,现在给name赋值
System.out.println(p1.name);
System.out.println(p1.age + "岁");//创建类时,age已赋值,直接调用
p1.sing(p1.name);
p1.talk("Chinese");
}
}
输出:
小明
25岁
小明会唱歌。
会讲chinese
Person p2 = new Person();
p2.name = "小红";
p2.age = 22;//此时,我们重新定义小红的age为22
System.out.println(p2.name);
System.out.println(p2.age);//同一个age,属于不同对象,有各自不同的值
p2.sing(p2.name);
p2.talk("English");
输出
小明
25岁
小明会唱歌。
会讲Chinese
小红
22岁
小红会唱歌。
会讲English
- 对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
- 意味着:如果我们修改一个对象的属性a,则不影响另外一个对象的属性a的值。
对象的销毁
Java(特别是JVM)使用自动垃圾回收机制。简而言之,当新对象被创建,JVM就会自动为这些新创建的对象分配内存。于是,当这些对象没有任何引用的时候,他们就会被销毁并且他们所占用的内存就会被回收。
Java垃圾回收是分代的,基于这种假设(分代假设)大多数的对象在很年轻的时候就已经不可达(在他们被创建之后的很短的时间内就没有任何引用并且被安全销毁)。大多数开发者曾经相信在Java中创建对象是很慢的并且应该尽可能地避免新对象的实例化。实际上,这并不成立:在Java中创建对象的开销非常的小并且很快。虽然如此,但是没有必要创建生命周期比较长的对象,因为创建过多的长寿命对象最终可能会填满老年代空间从而引发stop-the-world的垃圾回收,这样的话开销就会比较大。
一个对象被当作垃圾回收主要有以下的两种情况:
1、对象的引用超过其作用范围{
Object o = new Object(); // 对象o的作用范围,超过这个范围对象将被视为垃圾
}
2、对象被赋值为null{
Object o = new Object();
o = null; // 对象被赋值为null将被视为垃圾
}
在java的Object类当中,提供了一个protected类型的finalize()方法,所以的话,任何的java类都能够覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。
GC垃圾回收器
GC
回收哪个区域的垃圾?
JVM GC
只回收堆区和方法区内的对象。而栈区的数据,在超出作用域后会被JVM
自动释放掉,所以其不在JVM GC
的管理范围内。
GC
怎么判断对象可以被回收?
当某个对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。
- 对象没有引用;
- 作用域发生未捕获异常;
- 程序在作用域正常执行完毕;
- 程序执行了
System.exit()
; - 程序发生意外终止(被杀线程等)。
怎么判断对象是否可以被回收?
- 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数-1,当计数器为О时就可以被回收。它有一个缺点不能解决循环引用的问题;
- 可达性分析: 从
GC Roots
开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Root
没有任何引用链相连时,则证明此对象是可以被回收的。
补充了解:
GC ROOTS包含哪些
在虚拟机栈中引用的对象;
方法区中类静态属性引用的对象;
方法区中常量引用的对象;
本地方法栈中JNI引用的对象;
Java虚拟机内部的引用,如基本数据类型对应的class对象等;
所有被同步锁(synchronized 关键字)持有的对象;
反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。
匿名对象
匿名对象的定义
匿名对象指的就是没有名字的对象,在使用中理解为实例化一个类对象,但是并不把它赋给一个对应的类变量,而是直接使用。在理解匿名对象前,我们先创建一个类便于后面的使用。
class Student{
String name;
public void showInfo(){
System.out.println("Name is: " + this.name);
}
}
匿名对象具有以下特征:
语法上:只创建对象,但不用变量来接收,例如:假设现在Student类如上所示,通常情况我们在使用这个类时需要先实例化类对象,然后调用类的属性和方法
Student s = new Student();
s.name = "Forlogen";
s.showInfo(); // Forlogen
而匿名类不适用变量直接接收
System.out.println(new Student().name)
匿名对象的使用
1.匿名对象也是一个对象,具有对象的所有功能
2.每一次使用匿名对象时,都是一个新的对象, 每次创建匿名对象都是不同的对象,一个匿名对象,只能使用一次,即匿名对象只能调用一次
注意:匿名对象只在堆内存中开辟空间,而不存在栈内存的引用
public class Greeting {
public void sayHello(String name) {
System.out.println("Hello, " + name + "!");
}
}
public class Main {
public static void main(String[] args) {
// 使用匿名对象调用sayHello方法
new Greeting().sayHello("World");
// 注意:这里我们没有将Greeting的实例赋值给任何变量
// 一旦执行了sayHello方法,该匿名对象就会被垃圾回收器回收
}
}
标签:Java,name,对象,回收,匿名,引用,中类
From: https://www.cnblogs.com/BingBing-8888/p/18357599