首页 > 编程语言 >Java中类与对象的学习下

Java中类与对象的学习下

时间:2024-08-13 20:08:00浏览次数:14  
标签:Java name 对象 回收 匿名 引用 中类

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

相关文章

  • 我们常用的地铁卡/银行卡,竟然运行着一个 Java 虚拟机
    我们日常使用NFC卡可以用来刷地铁,进出门禁,但是你有没有想过,当我们使用一个NFC的IC卡刷卡进入地铁的时候,此时系统是如何知道我这个卡上有多少充值余额的?这个薄薄的NFC卡到底有什么魔力,除了可以刷卡进地铁,还可以去银行取钱,进出小区门禁。今天我在看到一些物联网的知识时,......
  • 解密Java中介者模式:代码实例带你深入理解
    1.引言:中介者模式的重要性在软件设计的世界里,模块间的相互依赖往往会导致系统的复杂性和维护难度的增加。中介者模式(MediatorPattern)作为一种行为设计模式,它的出现就是为了解决这一问题。通过引入一个中介者对象,它能够协调各个模块之间的通信,从而实现模块间的解耦,提高系......
  • javase-day06
    aFile_FileDemo01packagecom.se.aFile;/***绝对路径与相对路径的说明:*1.当前工作空间是/home/user/michael/**需求1:访问/home/user/michael/file1.txt*相对路径:file1.txt*绝对路径:/home/user/michael/file1.txt**需求2:访问/home/user/mi......
  • windows核心编程 第三章,跨越进程边界共享内核对象,对象句柄的继承性,改变句柄的标志,命名
    windows核心编程3.3跨越进程边界共享内核对象3.3.1对象句柄的继承性3.3.2改变句柄的标志3.3.3命名对象3.3.4终端服务器的名字空间3.3.5复制对象句柄文章目录windows核心编程3.3跨越进程边界共享内核对象3.3.1对象句柄的继承性3.3.2改变句柄的标志3.3.3命名......
  • java 读取文件夹文件
    以下是多种不同的Java实现方法来读取文件夹中的文件:方法一:使用File类importjava.io.File;publicclassReadFilesInFolder{publicstaticvoidmain(String[]args){Filefolder=newFile("folderPath");File[]files=folder.listFiles();......
  • Java线程池学习
    Java线程池学习一、线程池基础1定义2优点3基本组件二、Java线程池实现1Executor接口2ExecutorService接口3ThreadPoolExecutor类3.1创建线程池实例三、执行策略1直接提交策略(DirectSubmissionExecutor)2固定线程数策略(FixedThreadPool)3缓存线程池策略......
  • 学习:Java中的内存管理
    在Java中,对对象进行分配和取消分配的过程,称为内存管理。Java通过垃圾收集器(GarbageCollector,GC)实现了自动内存管理,这意味着开发者无需显式地释放对象所占用的内存。Java内存管理分为两个主要部分:JVM(Java虚拟机)内存结构垃圾回收器的工作一、JVM内存结构Java虚......
  • java浅拷贝BeanUtils.copyProperties引发的RPC异常
    背景近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到人在地铁上,bug从咚咚来~没有任何修改的服务接口,抛出异常:java.lang.ClassCastException:java.util.HashMapcannotbecasttocn.xxx.xxx.xxx.xx......
  • 一个基于 Java 接口参数加密框架,让接口参数加密变得简单、优雅!
    SecurityApiv1.0.1一个基于Java接口参数加密框架,让接口参数加密变得简单、优雅!文章目录一、SecurityApi介绍二、SecurityApi依赖三、使用1.RSA加密(非对称加密)1.1简单示例1.2生成RSA密钥1.3加签名说明「第一个场景」B要给A传递一条加密消息「第二个场景」B......
  • 计算机毕业设计推荐-基于java的地方特色美食分享管理系统
    ......