首先,提个问题: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与指针的更多相关文章

  1. Atitit.java c++指针使用总结O7

    Atitit.java c++指针使用总结O7 1. 指针的本质 1 2. 指针的作用 1 1. 提升性能问题这常常用于遍历数组, 1 2. 计算两个指针的的距离 2 3. 避免栈溢出,创建动态数据结 ...

  2. 实践出真知-所谓"java没有指针",那叫做引用!

    java没有指针,那我们如何实现动态数组呢? 上篇评论提及 ”不仅有vector,还有ArrayList,还有List,可做选择“. "java没有指针",那叫做引用! 今天尝试了 ...

  3. java没有指针

    先说结论:java没有指针,它使用对象引用来替代指针 备注:c/c++的引用和java的引用完全不是一个东西 c/c++的引用是同一块内存的不同名字 java的引用指向一个对象,引用本身也占用了内存 ...

  4. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  5. 关于java中指针的概念

    今天寡人遇到一个问题,扫描非关系数据库中的图(由node和rel组成),将其转化成由寡人自定义的gnode和gedge组成的图. gnode类包含结点的id,label和包含此gnode的gedge的 ...

  6. Java 中空指针处理方法

    空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常.本文介绍如何避免出现空指针异常. 首先我们看如下的示例: private Boolean isF ...

  7. java 文件指针复位

    BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream("userremain.l ...

  8. java中引用对比C++指针

    前置知识地址:https://blog.csdn.net/wangfei8348/article/details/51383805 重点在后面的引用对比实验(测试出内存地址,我很开心哈哈哈,客观给个好 ...

  9. JAVA中的指针

    不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...

随机推荐

  1. hibernate对象关系实现(四)继承实现

    继承实现方式分为三种:subclass; joined-subclass;union-subclass a.类中体现   b.库中体现分为三种: b.1:一种方式:人和学生公用一张表,添加一个辨别字段 ...

  2. web设计经验<八>20个设计新手常犯的排版设计误区

    很多同学问设哥,为什么别人字体就那么随意放一下就辣么好看,其实排版可有大学问,不是随意放就好看.这就如同配色一样,也有千变万化的学问.相信大家看完Designschool这篇头条热文,一定倍有收获. ...

  3. js打印出对象的方法

    var description = ""; for (var i in order) { var property = order[i]; description += i + & ...

  4. Android批量图片加载经典系列——采用二级缓存、异步加载网络图片

    一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络. ...

  5. cpu缓存与多线程

    一.cpu缓存结构 CPU速度远高于内存(即如果只考虑CPU和内存因素,程序的性能常常受到内存访问速度的限制,内存访问和运行),为了协调CPU和内存在速度上的差异,在CPU中增加了高速缓存.和计算机存 ...

  6. mybatis generator

    http://blog.csdn.net/sunny243788557/article/details/45166397 http://www.cnblogs.com/smileberry/p/414 ...

  7. 例题:超市买东西的程序。输入商品信息,计算价格,价格满多少元打折。这道题用到结构体,集合,for循环,if else语句

    知识要点: 集合和数组的区别:数组是连续的,同一类型的一块区域,而集合可以是不连续的,多种数据类型的. 集合属性:.count 方法:.Add()  将对象添加到ArrayList中实际包含的元素数 ...

  8. 【转】 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  9. 5.6 WebDriver API实例讲解(31-35)

    31.判断页面元素是否存在 public static void testElementExist(){ driver.get("http://www.sogou.com"); t ...

  10. cssText

    cssText 的本质就是设置 HTML 元素的 style 属性值 cssText 的方便之处在于一次可以写很多属性,而且变更 CSS 样式不必变 JS 代码,只需变样式字符串.但它有个缺点,就是它 ...