堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系

前言:上一篇中我们介绍了new关键字 点击打开链接,new一个类,实际上就是调用该类的构造函数,返回该类的对象。如a = new Animal();返回的对象赋给变量a。我们来分析一下内存分配的步骤,new一个类,实际上就创造了一个对象,就要为这个对象分配内存来存储成员变量,放在哪里?放在了堆内存中。那么把这个对象赋给a,需要再开辟一块儿堆内存然后复制成员变量么?答案是否定的。实际上a是一个引用变量,它只存储内存的地址,系统会让这个引用变量指向对象的内存,而不会重新开辟。所以,如果希望垃圾回收机制回收某个对象,那么只需要切断该对象所有引用变量和该对象(该内存空间)的关系,即a=null;内存将会自动被回收。

那么a存放在哪里?a存放在栈中。

this:this关键字引用(指向)调用该方法的对象。但倘若this出现在构造器中则是引用该构造器正在初始化的对象。那么this到底有什么用?我们会遇到这种情况,一个方法中需要调用另一个方法,由于调用任何方法都需要对象,那么如果调用的是本方法对象中的另一个方法,则用this关键字来表示这个对象。当然,不用this关键字,同一个对象中的方法可以相互调用,但是其本质还是隐式的调用了this方法。

那么问题就来了1:static修饰的方法中,是否可以调用非static修饰的成员方法?答案:否,因为调用方法实际上隐式的调用了this来告知对象是谁,但是static修饰的方法是属于类的,而不是属于对象的。所以无法找到对应该方法的对象。也就是不能使用this,也就无法调用其他方法了。

那么问题就来了2:static修饰的方法中,是否可以调用static修饰的成员方法?答案:是,因为调用static修饰的方法,实际上默认调用了该类(见点击打开链接),而不是this,又static修饰的方法可以找到该类,所以static调用static是可行的。

如果实在是必须在静态方法中调用非静态变量或方法,怎么办?那就只能在调用的时候重新申请对象:比如

System.out.println(new Animal().foot);那么问题又来了,既然static这么不好使,为什么还要设置static这么个关键字?其实,其区别就在于使用static修饰的方法,无论对象是谁,调用的结果都一样。但是非使用static修饰的方法,不同的对象调用就会不同。比如static修饰了一个变量x,则无论创建多少实例,其调用的都是这个x。但是如果调用普通变量b,那么每次创建实例都要重新给b赋值。因为static变量是属于类的,其生存周期和类相同,但是普通变量是属于对象的,其生存周期与变量是相同的,对象不存在了,该变量就不存在了。

成员变量(无论是类变量还是对象变量)都存放在堆中,但是局部变量则存放于栈中,由于局部变量不需要系统垃圾回收,随着代码块儿或者方法的运行结束而结束,所以所占内存比较小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容。如何通过SwingWork实…

java读c二进制文件_如何使用JAVA读取C / Matlab创建的二进制文件

小编典典正如我所猜测的那样,这是一个字节序问题,即您的二进制文件被写为低字节序的整数(可能是因为您使用的是Intel或类似的CPU)。但是,无论Java代码运行在哪个CPU上,它都在读取大端整数。为了显示该问题,以下代码将读…

java 通联支付接口_allinpay 通联支付接口实例

【实例简介】allinpay 支付的实例代码,这只是部分,需要其它的请联系我。 帮忙找【实例截图】【核心代码】201708081652114811└── unionorder_demo├── java│ └── uniondemo│ ├── WebContent│ │ ├── META-INF│ │ │ └…

java web tcp长连接超时时间_常用java web容器http长连接超时设置

1.http长连接相关知识http长连接对我们来说并不陌生,但长连接并不是永远不会关闭。对于HTTP长连接需要注意下面几点:keepalive_timeout指的是web服务器发送完最后一个响应报文后,开始计时,如果在keepalive_timeout指定的时间内还没…

java相遇问题_行程问题

行程问题 《行程问题》说课设计——现代教育信息技术与数学学科的整合福建省闽侯县尚干中心小学 林惠贞 邮编:350112 邮箱:zhenzi2277163.com众所周知,未来的教育,倡导开放式学习,把学习的地点扩展到社会、网络&…

jbutton 数组创建 java_java-将JButton数组添加到JPanel(按钮不可见)

我正在尝试使用Java创建一个简单的计算器.为此,我创建了一个JButton数组并将其添加到JPanel中.问题:按钮不可见.我还添加了一个JLabel和一个JButton进行测试,它们可以正确显示.编码:package test;import java.awt.BorderLayout;import javax.swing.*;pub…

jwt java 项目实例_JWT(JsonWebToken)+SpringMVC项目demo

【实例简介】JSON Web Token(JWT)是一个非常轻巧的规范。现在免费给大家分享一个JWT(JsonWebToken)SpringMVC项目的demo!【实例截图】【核心代码】jwt-demo└── jwt-demo├── pom.xml├── src│ └── main│ ├── java│ │ └── com│ │ └── hthl…

java写一个99到0_Java中一个普通的循环为何从10开始到99连续相乘会得到0?

【套装4本】java编程思想4第4版402.5元包邮(需用券)去购买 >这是一块非常简单的Java代码片段&#xff1a;public class HelloWorld{public static void main(String []args){int product 1;for (int i 10; i < 99; i) {product * i;}System.out.println(product);}}为什…

neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

一、Cypher数据create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}),(小菲:朋友圈{姓名:"小菲", 喜欢的书类:"Science Fiction"}),(小鹏:朋友圈{姓名:"小鹏", 喜欢的书类:"Music"}),(小颖:朋友圈{姓名:"…

java 返回两个集合_使用 java stream 获取两个集合之间的交集.差集

原始对象List hrProbationMainList new ArrayList();List hrProbationMains probationMainDao.findAll();获取交集对象stream 转换成流 (只有变成流才能操作)filter 封装判断条件(如果true 则收集到结果中,false则不收集)collect 收集结果返回到指定类型中//交集对象ListhrPro…

java重写重定向_JavaWeb请求转发与请求重定向理解

请求转发使用方法httpServletRequest.getRequestDispatcher("login.jsp").forward(httpServletRequest, servletresponse);此请求过程 完全是一次request对象 完成的。我们可以用 filter 截取用户的这次请求&#xff0c;然后利用这次请求 访问其它页面&#xff0c;当…

autojs调用java识字_autojs实现抽象类的继承

作者: 牙叔使用情景在java中, 抽象类必须继承才能使用, 那么在autojs中怎样实现继承抽象类呢?java中的实现创建一个抽象类package com.yashu;public abstract class Employee{ private String name; private String address; private int number; public abstract double com…

java wix_使用WIX升级MSI

我正在使用WIX创建一个MSI安装程序 . 一切都很好&#xff0c;我能够创建自己的产品并创造一切 .但是&#xff0c;当我想要创建升级时&#xff0c;它无法正常工作 .我使用了以下代码&#xff0c;其中$(var.ProductUpgradeCode)被定义并用作product元素中的upgrade-code .Minimum…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

flat在java中的含义_Java 9中Collectors.flatMapping()方法的重要性?

在Java 9中&#xff0c;向Collectors类添加了一个新方法&#xff1a;flatMapping()。它类似于Collectors.mapping()方法&#xff0c;其中flatMapping()方法允许我们处理嵌套的集合。 Collectors.flatMapping()方法需要的功能将被施加到输入元件和集电极积累通过功能传递的元件。…

hhkb适合写java吗_起底这届HHKB最强新品键盘,究竟好在哪儿?

2019年12月HHKB上市了3大品类的12款新品键盘&#xff0c;今天为大家分享外设天下为HHKB Professional HYBIRD Type-S 双模静音旗舰版静电容键盘做的评测&#xff0c;起底这届HHKB新品的最强新品。近日&#xff0c;HHKB更新了旗下的在售产品系列&#xff0c;为了满足严肃、安静办…

java暂停5s_java如何实现继续/暂停按钮

匿名用户1级2016-11-24 回答很简单&#xff0c;我给你写一个Demo&#xff1a;import java.awt.event.*;import javax.swing.*;public class Demo extends Thread {private JFrame frm new JFrame("Demo");private JButton btnPause new JButton("Pause")…

c mysql数据库_C实现MySQL数据库操作

C实现MySQL数据库操作两个月前&#xff0c;也就是9月份&#xff0c;心血来潮在windows下实现了用C连接数据库&#xff0c;当时很是有把linux下一并给实现了。但是没有想得那么简单。这个任务一直推迟到了现在才完成&#xff0c;究其原因&#xff1a;1.我直接用eclipse开发工具&…

php生成不重复时间戳,PHP获取时间戳和微秒数以及生成唯一ID

microtime函数描述&#xff1a;返回当前Unix时间戳和微秒数语法&#xff1a;mixed microtime( [ bool $get_as_float ] )//直接输出echo microtime();//得到的是 如&#xff1a;0.26672100 1585622985 前面是当前微秒数&#xff0c;后面是正常时间戳&#xff0c;中间以空格分隔…

php异步处理任务工具,PHP实现异步任务分发处理利器-Gearman

通常&#xff0c;多语言多系统之间的集成是个大问题&#xff0c;一般来说&#xff0c;人们多半会采用WebService的方式来处理此类集成问题&#xff0c;但不管采用何 种风格的WebService&#xff0c;如RPC风格&#xff0c;或者REST风格&#xff0c;其本身都有一定的复杂性。相比…