1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........

程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部分new X()做了什么,new X这个对象的时候,必然会调用这个类的构造方法,并且需要在堆中给对象分配内存,前半部分X a只是在栈中申明了一个内存空间,这个内存空间的类型是X,后半部分的值不可能直接赋值给a吧,如果new X()的值很大怎么办?所以a的值就是后半部分的内存的地址,也叫引用变量。所以我们搞懂了X a=new a()的后半部分是实例或者对象,前半部分是引用变量。

2.String中的new

我们在使用String a=“abc”类似的这种语句的时候,我们有没有想过,我们为什么不用String a=new String(),而用String a=“abc”呢?它们俩有什么区别?

public class StringTest {
public static void main(String[] args) {
String str1="abc";
String str2=new String("abc");
String str3=null;
str3=str1; if(str1==str2){
System.out.println("str1和str2是一个内存空间的"); }
if(str1==str3){
System.out.println("str1和str3是一个内存空间的");
}
if(str2==str3){
System.out.println("str2和str3是一个内存空间的");
} }
}

运行结果:

str1和str3是一个内存空间的

大家都知道==是判断对象是否为一个内存空间的。我们想想为什么运行结果是这样?

先看看String类型的对象的产生方法:

String有一个所谓的String constant pool ,是一个特殊的一个空间(注意这个是在PermGen上的,它是JVM用来保存类定义和常量池的保留空间,缺省是64M)保存String常量。String str = “abc”是先定义一个名为str的对String类的对象引用变量:String str;再用equals方法(String类覆盖了equals方法)判断这个特殊空间(String constant pool )是否有abc,有则将原来在栈中指向abc的引用赋值给str,否则就在这个特殊空间(String constant pool )上开辟一个存放字面值为"abc"的地址,接着在堆上创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。最后将str指向对象o的地址。

String str2 = new String("abc"),这里"abc"本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。这条语句就创建了2个String对象。它引用堆上创建的abc对象。所以str和str2是指向不同的对象,它们是不同的。那么这样话程序的运行结果就好理解了。

结论:运行结果正好验证了我们1所提到的,使用String a="abc"相比与String a=new String("abc")更好,原因就是节省空间。

3.new关键字牵扯的向下或者向上转型

A.java

public class A {

    public String f(A obj)
{
return("A");
}
}

B.java

public class B extends A{
public String f(B obj)
{
return("B");
}
public String f(A obj)
{
return("Aplus");
} }

Test.java

public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B(); //子类对象转化为父类,称为上转型,不需要强制转换。
B b = new B();
System.out.println(a2.f(b)); //不会出现ClassCastException
B b1 = (B) a2;
System.out.println(b1.f(b));
System.out.println(b1.f(a1)); //会出现ClassCastException
B b2=(B) a1;
System.out.println(b1.f(b));
System.out.println(b1.f(a1)); //父转子是危险的,这种情况会可能出现内存越界,所以向下转型需要用instanceof判断
if (a2 instanceof B) {
B b1 = (B) a2; //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例
System.out.println(b1.f(b));
System.out.println(b1.f(a1));
}
} }

运行结果:

Aplus
B
Aplus

结论:

向上转型:

优点:向上转型体现了类的多态性,增强了程序的简洁性,上转型对象可以操作和使用子类继承或者重写的方法。

缺点:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。

向下转型:

给个例子,如果你说麻雀是鸟(向上转型),对的。那如果你说鸟是麻雀(向下转型),mdzz。

4.java创建对象时, = null和new 出一个对象为空(String str=new String())的区别

前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。

谈谈关键字new的更多相关文章

  1. 谈谈关键字strictfp

     Java语言中的其中一个设计目标是可移植性.无论在哪个虚拟机上运行,同一个计算应该得到同样的结果.对于浮点数的算术运算,实现这样的可移植性是相当困难的.double 类型使用 64 位存储一个 do ...

  2. 谈谈关键字final

    final:可用于修饰类.方法.变量,表示它修饰的类.方法和变量不可改变. (1)修饰变量:变量只能被赋值一次,赋值后不能更改.按照Java代码惯例,final变量就是常量,而且通常常量名要大写: ① ...

  3. 作为一个新手的Oracle(DBA)学习笔记【转】

    一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...

  4. 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. 谈谈Javascript的this关键字(this is not this)

    前言: 看文章标题你就知道,这篇文章我只讲一个简单的Javascript的this关键字,说它简单——它又不简单,因为曾几何时我也对this关键字有些困惑,它也确实会让不少程序员感到不解——它像是一个 ...

  7. 谈谈以下关键字的作用auto static register const volatile extern

    (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是 ...

  8. 谈谈volatile关键字以及常见的误解

    转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9092520.html 近期看到C++标准中对volatile关键字的定义, ...

  9. 谈谈java中的final关键字

    知识点:final(最终的)关键字修饰类.方法.属性 1.final修饰类:那么这个就无法被继承,如String类.StringBuffer类.System类 2.final修饰方法:被修饰的方法不能 ...

随机推荐

  1. 如何把git仓库(包含所有提交历史)迁移到gitlab

    在gitlab上new 一个project 跳转到本地的git 目录中,运行命令 git remote add gitlab gitlab_new_project_address -最后运行如下命令, ...

  2. 【Web性能进阶】1.无线网络基础

    一.无所不在的连接 针对不通的使用场景,无线网络技术有很多种. 鉴于无线网络技术如此多样,笼统地概括所有无线网络的性能优化手段是不可能的.好在大多数无线技术的原理都是相通的,衡量性能的指标和约束条件也 ...

  3. 《高性能MySQL(第3版)》【PDF】下载

    内容简介 <高性能mysql(第3版)>是mysql 领域的经典之作,拥有广泛的影响力.第3版更新了大量的内容,不但涵盖了最新mysql5.5版本的新特性,也讲述了关于固态盘.高可扩展性设 ...

  4. 7 Series GTP IP核使用总结 IP核配置篇

    FPGA内嵌收发器相当于以太网中的PHY芯片,但更灵活更高效,线速率也在随着FPGA芯片的发展升级.本文对7系列FPGA内部高速收发器GTP IP核的配置和使用做些简单的总结,以备后续回顾重用.本文是 ...

  5. 转:Siri之父:语音交互或将主导未来十年发展

    http://zhinengjiaohu.juhangye.com/201709/weixin_5664458.html Siri之父Adam Cheyer认为,语音交互很可能是未来十年内计算技术的一 ...

  6. pwd 命令详解

    pwd 作用: 以绝对路径的方式显示用户当前工作目录,命令将当前目录的全路径名称(从根目录)写入标准输出, 全部目录使用/分隔,第一个/表示根目录, 最后一个/ 表示当前目录. 执行pwd 命令可以立 ...

  7. cd 命令详解

    cd 命令 作用:  cd 用来切换目录,目录表示法可为绝对路径或相对路径, 若目录名称省略,则变换至使用者的登陆目录. ~ 可表示为家目录,.为当前目录,..为上级目录 语法: cd (选项)(参数 ...

  8. Effective Java 第三版——13. 谨慎地重写 clone 方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 安装spark单机环境

    (假定已经装好的hadoop,不管你装没装好,反正我是装好了) 1 下载spark安装包 http://spark.apache.org/downloads.html 下载spark-1.6.1-bi ...

  10. Python学习_02_数字和运算

    python具有强大的科学运算功能,python由于支持更加强大的面向对象和动态特性,相比R语言.matlab.mathmatic等传统的科学计算工具具有非常大的优势. Python的数字 pytho ...