java 之 引用(基本类型的包装类,构造函数析构函数与c++不同)

  一:java 和c++引用的对比

提到引用,我们都会想到java里面没有像c++里面的指针,当然java里面的引用和c++里面的引用是不同的。

例如:

比如C++中,我对某一个函数的声明,int a(int &b),b即为引用类型,函数内b的修改可以影响到函数外部;

C++中,int a(int &b){},b即为引用类型,若没有&,b即为值类型;但是在java里面没有显示的符号说明是引用;

Java没有这样的概念,但是有引用类型与值类型的区别可以把一个引用类型当作参数传递,此时函数内部的修改会影响到外部

二:java中的引用是自发的,基本类型传递的是值,对象和数组传递的是引用

如下表达式: A a1 = new A(); 它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。 

在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。 

再如: A a2; 它代表A是类,a2是引用,a2不是对象,a2所指向的对象为空null; 再如: a2 = a1; 它代表,a2是引用,a1也是引用,a1所指向的对象的地址传给了a2(传址),使得a2和a1指向了同一对象。 

综上所述,可以简单的记为,在初始化时,“=”语句左边的是引用,右边new出来的是对象。

在后面的左右都是引用的“=”语句时,左右的引用同时指向了右边引用所指向的对象。 

再所谓实例,其实就是对象的同义词。  

值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。 

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

三:java 创建对象的方式

1.new       2.newInstance

3.clone     4.反序列化


5.String s = "abc"(这个是比较特殊的)

以String类为例
第一种:
String str = new String();
第二种:
String str = Class.forName(String).newInstance()
两种方法创建的对象实体没有任何区别,如果硬说有区别的话,那就是第一种直接调用了本类的构造函数,如果本类有多个构造函数重载的话,可以添加参数。而第二种是调用这个类的默认构造函数,即不带任何参数的。
第一种方法是最常用,最普遍的用法。第二种方法叫做工厂模式,是一种较安全的方法。

四:java中有析构函数,但与C++中的不同没有~

java中有析构函数,但我们一般用不到它,因为java有自动内存回收机制,无需程序员来释放,也就不要担心内存泄露,只不过java中析构函数所采用的方式不是C++中的那样前加~号,在java中
对象析构时会调用void finalize()方法,因此你如果确实需要析构的话就可以为你写的类添加一个void finalize(){}方法,来完成你所需要的工作

五:java中的基本类型的包转类,泛型时需要,因为泛型不能应用到基本类型上(百度摘抄)

java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。

包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:

包装类对应表

基本数据类型

包装类

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double   在这八个类名中,除了IntegerCharacter类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。

         对于包装类说,这些类的用途主要包含两种:

                  a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。

                  b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

         由于八个包装类的使用比较类似,下面以最常用的Integer类为例子介绍包装类的实际使用。

         1、实现intInteger类之间的转换

在实际转换时,使用Integer类的构造方法和Integer类内部的intValue方法实现这些类型之间的相互转换,实现的代码如下:

                  int n = 10;

                  Integer in = new Integer(100);

                  //int类型转换为Integer类型

                  Integer in1 = new Integer(n);

                  //Integer类型的对象转换为int类型

                  int m = in.intValue();

         2Integer类内部的常用方法

                 Integer类内部包含了一些和int操作有关的方法,下面介绍一些比较常用的方法:

                  aparseInt方法

                           public static int parseInt(String s)

该方法的作用是将数字字符串转换为int数值。在以后的界面编程中,将字符串转换为对应的int数字是一种比较常见的操作。使用示例如下:

                                    String s = “123”;

                                    int n = Integer.parseInt(s);

int变量n的值是123,该方法实际上实现了字符串和int之间的转换,如果字符串都包含的不是都是数字字符,则程序执行将出现异常。(说明:异常的概念将在下一章进行讲述)

另外一个parseInt方法:

        public static int parseInt(String s, int radix)

则实现将字符串按照参数radix指定的进制转换为int,使用示例如下:

        //将字符串”120”按照十进制转换为int,则结果为120

        int n = Integer.parseInt(“120”,10);

        //将字符串”12”按照十六进制转换为int,则结果为18

        int n = Integer.parseInt(“12”,16);

        //将字符串”ff”按照十六进制转换为int,则结果为255

        int n = Integer.parseInt(“ff”,16);

这样可以实现更灵活的转换。

                  btoString方法

                           public static String toString(int i)

                           该方法的作用是将int类型转换为对应的String类型。

                           使用示例代码如下:

                                    int m = 1000;

                                    String s = Integer.toString(m);

                           则字符串s的值是”1000”

                           另外一个toString方法则实现将int值转换为特定进制的字符串:

                                    public static int parseInt(String s, int radix)

                           使用示例代码如下:

                                    int m = 20;

                                    String s = Integer.toString(m);

                           则字符串s的值是”14”

         其实,JDK自从1.5(5.0)版本以后,就引入了自动拆装箱的语法,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。使用示例代码如下:

                  //int类型会自动转换为Integer类型

                  int m = 12;

                  Integer in = m;

                  //Integer类型会自动转换为int类型

                  int n = in;

         所以在实际使用时的类型转换将变得很简单,系统将自动实现对应的转换。

六:static块再类加载的时候就调用,不用初试话为对象

package edu.tju.test;

public class AA {
//	private AA(){}
//	//public AA(){}
//	private static AA instance = null;
//	public static int cp = 0;
//	public AA getInstacne(){
//		if(null == instance){
//			instance = new AA();
//			cp++;
//		}
//		cp++;
//		return instance;
//	}
	static{
		System.out.println("Test……static");
	}
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
//		System.out.println("Test……" + cp);
//		AA aa = new AA();
//		AA bb = (AA)Class.forName("edu.tju.test.AA").newInstance();
//		//bb = aa;
//		aa.getInstacne();
//		System.out.println("Test……" + cp);
//		bb.getInstacne();
//		System.out.println("Test……" + cp);
		new AA();
		new AA();
		try{
			return;
		}finally{
		System.out.println("Test……");
		}
		
	}
}

输出结构为:

Test……static
Test……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值