Java中类与对象的学习下

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方法,该匿名对象就会被垃圾回收器回收  
    }  
}
posted @ 2024-08-13 19:53  BingBing爱化学-04044  阅读(13)  评论(0)    收藏  举报