Java跨平台&数据类型

编译型语言

编译型语言是指用专门的编译器,针对特定的平台,将某种高级语言源代码一次性“翻译”为可被该平台硬件执行的机器码。简单来说,就是把源程序一次性编译成机器码,然后再执行。这种方式代码执行效率通常比较高,但是由于代码是一次性编译为特定平台所执行的机器码,所以编译后的可执行程序通常无法移植到其他平台上运行,无法做到一次编译,到处运行的效果。如果想要移植,就要把源代码复制到其他平台,针对特定平台进行修改,然后再重新编译为可执行程序。

解释性语言

解释型语言是只使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行语言。解释性语言性优势就是跨平台比较容易,因为存在专门解释器,针对不同的平台将源程序解释为特定的机器码文件,解释器不会把真个程序都转移出来,它每转译一行,就会立即运行。解释性语言可以方便的实现源程序的移植,但程序大的运行效率通常比较低,因为每执行一次程序都需要进行编译,所以解释性语言的效率通常会比较低。

总结两者的跨平台性

1.编译型语言:执行前需要进行编译的过程,编译成为一个可执行的机器语言文件 ,比如exe文件。这样做的好处执行效率高,在同一个平台上可是实现底层代码的应用。但是这也导致一个缺点,就是跨平台能力弱,编译器生成只能针对本地平台生成特定的可执行的文件,这种文件如果放到其他平台上运行,执行起来可能就会出错。可能会问,如果将源码复制到其他的机器上,然后调试环境,然后再编译一遍,然后再执行,这样可移植性不就高了吗?但是这样的话效率就低了,而且配置环境这个非常麻烦的。

2.解释性语言:编写的程序不需要进行预先编译,以文本的形式存储源代码,执行时才翻译执行,程序执行一行就翻译一行。跨平台的时候只需要将程序拿到其他平台上,然后再下载所需要的解释器,就可执行了。但是带来的缺点就是运行效率低下。

Java跨平台

java跨平台是什么

首先要明确平台是什么?平台指的是硬件系统及其在其上面运行的应用程序的组合。跨平台就是指一段程序可以在不同的平台上运行。不同的编程的语言有不同级别的跨平台性。java跨平台结合了解释型语言和编译型语言的优缺点,做到了一次编译到处运行的跨平台性,相对与解释性语言,提高运行效率,相对于编译型语言提高了跨平台性。

Java运行机制

java语言编写的程序需要经过编译步骤,但这个编译步骤不会直接生成机器字节码文件,而是生成一种与平台无关的字节码(*.class文件),然后又java的内部解释器JVM来解释。

下载安装java8的JDK

java中JDK是java development kit的简称,jdk代表开发环境工具,包括编译源程序和运行及调试所需要的环境所需要的环境;JRE是java runtime environment的简称,代表运行环境。也就是说JDK是包含JRE的。也就是说如果只安装jre,是不能编译java源程序的,输入javac会报错。但是输入Java命令时可以运行的。jdk将.java文件编译成.class文件,jre负责执行.class文件。

CLASSPATH环境变量

依稀记得之前配置环境便来你的时候还要配置CLASSPATH, .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。当初也不知道为什么,就是跟着网上的教程配完,然后就能用了,就没有多想,今天重温基础的时候才搞明白。

在jdk1.4以前,是需要配置CLASSPATH的,他的作用就是当我们运行“java  java类名”时,他会告诉jre去哪里搜索这个类名,所以需要在CLASSPATH后面加".",意思就是在当前路径下搜索类名。此外编译和运行Java程序的时候还需lib目录下面的dt.jar和tools.jar文件中Java类,因此也需要把这两个文件加入到CLASSPATH环境变量中。jdk1.5之后的版本就会自动搜索当前目录下的类名,然后自动加载这两个文件。

但是如果设置错了CLASSPATH,就会出现一个很典型的错误。错误:找不到和无法加载主类 XXXX。所以如果指定了CLASSPATH一定不要再后面加上"."

注释

刚开始接触java的时候,懒得写注释,现在回过头来看自己写的代码,一点都看不懂,而且当初的程序设计方式也是习惯将一个函数放在一个大类里面,代码一点也不整洁。

注释里面除了单行注释和多行注释之外,还有另外一种注释方式是文档注释,文档注释如果写的好可以直接利用Javadoc这个命令生成一个api文档。利用文档注释可以指对类,成员变量,方法(构造方法),内部类以及接口进行注释。使用javac命令只能生成public和protect修饰的变量,方法等等。

javadoc  -d 生成的文档放在那个目录 -windowtitle 浏览器窗口名字 -doctitle  生成的文档标题 -header 每个页面的页眉 -author -version  java文件名(包名)

如果为多个包生成api文档,则需要在包文件目录里面添加一个package.html文件,javadoc会提取package.html文件中body标签里面的内容所谓作为包的描述信息。

package sunku;
/**
*Description:
*<br>网站地址
*<br>这个地方写一些html文本,用来描述这个类
*<br>This is my frist know the javadoc,I feel very happy
*<br>Program name:
*<br>date:
*@author 1299792067@qq.com
*@version 1.0
*/
public class Test1{
    /**
    *简单测试成员变量
    */
    public int age;
    /**
    *Test类的测试构造器
    */
    public Test1(){
    
    }
    /**
    *一个打招呼字符串的方法
    *@param name 该参数指向和谁打招呼
    *@return 返回打招呼的字符串
    */
    public String hello(String  name){
    
        return  name+",你好!";
    }
}

 数据类型

java的数据类型属于强数据类型,所有的变量必须先声明,后使用;指定类型的变量只能接收与其相匹配的值,但是可以进行数据类型的转换,这就包括数据类型自动转换和强制数据类型的转换。数据类型分为基本数据类型和引用数据类型,基本数据的类型的自动转换比价简单,但是注意的是Long类型定义时候的问题,基本数据类型转换本质就是位数底的数据类型可以向位数高的数据类型自动转换,这种转换方式,不会造成数据丢失。而强制类型转换则可能会造成数据丢失,引用数据类型就是对象引用了,比如数据就是引用数据类型 int a[]=new int[]。

何为引用数据类型,引用数据类型和基本数据类型的区别在于,基本数据类型,变量名对应的内存区域存储的是数据,而引用数据类型变量名对应的内存区域存储的是引用,这个引用指向堆内存的一个实例,这种不同在变量赋值的时候会展现出来。堆内存里面的一个对象实例可以被多个变量名引用,当将一个引用变量赋值给另一个引用变量的时候,这两个引用变量指向的是堆内存中的同一块区域。如果堆内存中的对象没有任何一个引用变量指向该对象,那么程序就无法再访问该对象,这个对象也就变成了垃圾,java的垃圾回收机制将回收该对象。因此如果希望通知垃圾回收机制回收某个对象,只需要将这些引用变量赋值为null,切断引用变量于堆内存对象之间的联系。

public class Test1
{
    public static void main(String[] args){
	//基本数据类型
        int a=1;
	int b=a;
	b=2;
	System.out.println("a="+a);
        System.out.println("b="+b);
        //引用数据类型
        Test2 student = new Test2("朱鹏程","男","信科院");
        Test2 student1 = student;
        System.out.println(student.getName()+" "+student.getApartment());
	student.setName("朱小龙");
	System.out.println(student1.getName()+" "+student1.getApartment());
    }
}

输出结果:

a=1
b=2
朱鹏程 信科院
朱小龙 信科院

//如果后面不加L,java不会自动把这个值当作Long类型来处理。
long value=99999999999999L;

包装类

在java里面有8中基本数据类型,他们的数据只存在于内存栈里面,这八种基本数据类型不支持面型对象的编程机制。这8中基本数据类型不能当作对象,如果一个方法需要一个object类型的变量,但是他们实际需要的是一个数值类型的变量,最原始的方法们就要对数据进行装箱,我觉的这样实现也可以。但是jdk1.5之后就可以自动拆箱和装箱了。

但是说了这么多,这个东西究竟什么使用到呢?我目前使用的比较多的包装类方法就是parseInt(),int a=Integer.parseInt("123");将一个字符串转为指定的数据类型。以List为例,大家bai都知道一个动态数组的add(Object o)方法只能接受一个引用类型,即一个对象,而怎样把一个数字放到一个动态数组里面...,相信到这里你已经明白了为什么一个值类型会有一个对应的包装类了吧。。

不得不感叹,Java里面还真是万物皆对象。

public class Integer{
    int a;
    public Integer(int a){
        this.a=a;
    }
    public int getInt(){
        return this.a;
    }

}

Integer a=new Integer(1);//装箱
a.getInt();//拆箱

public class Test1{
	
	public static void main(String args[]){
		Integer a;
		int b=1; //自动拆箱
		a=b;
		System.out.println(a);

		Integer c=2;
		int d=c; //自动装箱
		System.out.println(d);
	
	}

}

深入理解数组:

一个以为数组的声明 int a[]=new int[4],在内存中的过程堆栈分配的过程是这样的,首先要为变量名a分配一块栈内存,内存里面存储的是一个引用,这个引用指向对内存的一块数据,在堆内存里面系统为数组分为4个int(32位)类型的堆内存,初始化时堆内存中存储的时数字0。

为什么会由堆内存和栈内存呢?

只用堆内存和栈内存的好处就是可以更好利用内存资源,可以在程序的过程释放出一些内存资源,而不影响程序正常运行。比如在一个方法执行时,每个方法里面都会建立自己内存栈,然后将方法里面的局部变量存放在栈内存中,随着方法的执行结束,这个方法的内存栈自然会被销毁。成旭所创建一个对象时,这个对象会保存在一个数据取里面,以便反复利用,这个数据区就是堆内存,堆内存的数据不会随着方法的执行结束而被销毁,即使方法结束后,这个变量还可能被另一个引用变量所引用,只有当一个对象没有任何引用变量引用的时候,系统的垃圾回收机制才会在合适的时候对该对象进行回收。

因为变量和对象是引用的关系,所以同类型的数组时刻以直接赋值的,比如 a=b,其中a,b都是一个整型数组,赋值的过程就是a变量坐在的内存中存储的引用地址时发生改变的过程。这种数组赋值通常使用再数组扩容的时候,Arrays里面有一个方法叫做Arrays.copyOf(原数组,长度)

有时间看看JVM吧!

	public static void main(String args[]){
		int[] a={1,2,3,4,5};
		int[] b={2,3,4,5,6,2,3,4};

		for(int c:a){
			System.out.print(c+" ");
		}
		System.out.println();
		for(int c:b){
			System.out.print(c+" ");
		}
		System.out.println();

		a=Arrays.copyOf(b,a.length);
		                       
		for(int c:a){
			System.out.print(c+" ");
		}
		System.out.println();
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值