JAVA与指针
首先,提个问题:JAVA中没有指针,JAVA中有指针,哪个一个对呢?
答:都对,JAVA中没有指针,因为我们不能对指针直接操作,像C++那样用->来访问变量。
JAVA有指针,因为JDK中封装了指针。(现在我们就来找到这个指针)
我的理解:
在声明一个对象的时候,其实就是定义了一个指针变量。
注意:
1、指针变量有两层含义
1) 指针变量里存的是地址(它指向的变量的首地址)。
2) 指针变量有类型,类型说明了该指针指向的变量在内存中的范围(大小)。
2、使用创建一个对象包括声明和定义。
1) 声明是指定义一个指向该对象的指针变量。
2) 定义是指用new关键字在堆内存中创建了对象,并把他的首地址付给那个指针变量。
这样,很多概念就很容易理解了。
一、值传递和引用传递
举例说明:
测试程序为:
public class Student {
String name;
}
public class TestClass {
public static void main(String[] args) {
Student stu1;
stu1 = new Student();
stu1.name = "小明";
int a = 10;
System.out.println("改变前,stu1名字为" + stu1.name);
System.out.println("改变前,a的值为" + a);
TestClass myTest = new TestClass();
myTest.change(a, stu1);
System.out.println("改变后,stu1名字为" + stu1.name);
System.out.println("改变后,a的值为" + a);
}
void change(int num, Student student) {
num = num + 10;
student.name = "小强";
}
}
运行结果为:
改变前,stu1名字为小明
改变前,a的值为10
改变后,stu1名字为小强
改变后,a的值为10
在内存中的表示如下:
转变前:

JAVA与指针
转变时:把stu1的值(36DF)传给student,使student指向36DF。小明变成了小强。
把a的值10传给了num,使num变成了20。JAVA与指针
转变后:student和num两个变量被销毁。
JAVA与指针
所以,stu1指向的内容改变了,a的值不变。这也就是值传递与引用传递的区别。从中也可以看出就把Student stu1;理解成声明了一个指向Student类的指针变量就可以了。
这里只用String这个类特殊。
public class TestClass {
public static void main(String[] args) {
String name = "abc";
System.out.println(name);
TestClass myTest = new TestClass();
myTest.change(name);
System.out.println(name);
}
void change(String str) {
str = "abcd";
}
}
运行结果为:
改变前name为abc
改变前name为abc
按照前面的分析改变后的结果应该为:abcd,如图:JAVA与指针

但是你会发现问题,上文强调过指针的第二层含义为定义了变量在堆内存中的范围也就是name指向的变量只能为三个字母的范围,把name付给str,str也只能指向三个字母范围的变量,“abcd”超出了范围。(其实改为大小相同的“abd”也不行)
所以JAVA引入了一个字符串池的概念。就是说它会把所已知的字符串放入字符串池,如果你创建新字符串没有使用new关键字,它首先会去字符串池找有没有相同值的字符串,如果有的话就指向它;如果没有的话就会创建新的空间。
所以在内存中应该为:
JAVA与指针
二、父类与子类
举个例子,定义一个Father类,一个Son类,测试
public class Father {
String name;
Father(String name) {
System.out.println("Father一个参数构造函数");
this.name = name;
}
void drive() {
System.out.println("骑自行车");
}
}
public class Son extends Father {
Son(String name) {
super(name);
System.out.println("Son一个参数构造函数");
this.name = name;
}
@Override
void drive() {
System.out.println("开宝马");
}
void QQ() {
System.out.println("聊QQ");
}
}
public class Test {
public static void main(String[] args) {
Father son1 = new Son("小毛");
son1.drive();
}
}
结果为:
Father一个参数构造函数
Son一个参数构造函数
开宝马
内存分析:
son1为Father类的指针,但new了一个Son类的对象,并把这个对象付给了son1。
JAVA与指针

当new一个子类对象(构造子类对象)的时候,需要先创建父类对象,也就是要调用父类的默认构造函数(无参构造函数),如果父类没有无参构造函数也就是说他的无参构造函数被你重写了,那么子类也不能有无参的构造方法,并且在子类的有参构造方法中必须指明构造父类的构造方法(用Super关键字)。
JAVA与指针的更多相关文章
- Atitit.java c++指针使用总结O7
Atitit.java c++指针使用总结O7 1. 指针的本质 1 2. 指针的作用 1 1. 提升性能问题这常常用于遍历数组, 1 2. 计算两个指针的的距离 2 3. 避免栈溢出,创建动态数据结 ...
- 实践出真知-所谓"java没有指针",那叫做引用!
java没有指针,那我们如何实现动态数组呢? 上篇评论提及 ”不仅有vector,还有ArrayList,还有List,可做选择“. "java没有指针",那叫做引用! 今天尝试了 ...
- java没有指针
先说结论:java没有指针,它使用对象引用来替代指针 备注:c/c++的引用和java的引用完全不是一个东西 c/c++的引用是同一块内存的不同名字 java的引用指向一个对象,引用本身也占用了内存 ...
- Java中“指针”的解释以及对“引用”的理解
Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...
- 关于java中指针的概念
今天寡人遇到一个问题,扫描非关系数据库中的图(由node和rel组成),将其转化成由寡人自定义的gnode和gedge组成的图. gnode类包含结点的id,label和包含此gnode的gedge的 ...
- Java 中空指针处理方法
空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常.本文介绍如何避免出现空指针异常. 首先我们看如下的示例: private Boolean isF ...
- java 文件指针复位
BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream("userremain.l ...
- java中引用对比C++指针
前置知识地址:https://blog.csdn.net/wangfei8348/article/details/51383805 重点在后面的引用对比实验(测试出内存地址,我很开心哈哈哈,客观给个好 ...
- JAVA中的指针
不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...
随机推荐
- KMPlayer
1. KMP 播放时,有声无图像,黑屏.解决: 打开KMP然后右键-选项-参数设置(或者进入KMP直接按F2)-视频处理-右边选择“渲染器”-在“渲染器”中选择“VMR9 未渲染 (HQ字幕)”-选中 ...
- Android手机分辨率基础知识(DPI,DIP计算)二
dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...
- android设备休眠机制
如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设计,可就没准了. 首先Androi ...
- Openfire 是怎么存离线消息
原文:http://myopenfire.com/article/getarticle/26 1.openfire默认怎么存离线消息 在默认情况下,不添加任何插件的情况下,当用户不在线,对于发送给 ...
- IntelliJ IDEA 学习(六)内存设置
小伙伴们经常会发现,在开发的时候,经常遇到内存被占满,导致异常卡顿,有时候提示内存溢出,这时可以通过设置xmx来改善.不过切记最好不要超过内存的1/4 打开 IDEA 安装目录,看到有一个 bin 目 ...
- JavaScript判断鼠标滑轮是向下还是向上滚动
我们常用的就是鼠标,鼠标中键一般都用于滑动网页,但是网页中很多很炫的效果,使用鼠标滑轮操作更好. 当然对于手机就没有这个设备了,所以就不用考虑手机端的实现方法,手机端有触摸滑动事件. 使用JavaSc ...
- scala集合
优先使用不可变集合.不可变集合适用于大多数情况,让程序易于理解和推断,因为它们是引用透明的( referentially transparent )因此缺省也是线程安全的. 使用可变集合时,明确地引用 ...
- java 异常2
自定义异常类: import java.util.Scanner; /** * Created by lenovo on 2016/8/12. */ class NoMoneyException ex ...
- 指针转换(C# 编程指南)
原文地址:https://msdn.microsoft.com/zh-cn/library/etb4xxec.aspx 下表显示了预定义的隐式指针转换.隐式转换可能在多种情形下发生,包括调用方法时和在 ...
- css写宽为30%的正方形
如何用纯css写一宽为30%的正方形,用到了padding属性: 会不会恍然大悟呢? <!DOCTYPE html> <html lang="en"> &l ...