Java简单介绍
Java面向对象:一个面向对象的木匠关心的制作的椅子;这个木匠干了什么事情
非面向对象的木匠关心的是所使用的工具。
狗吃粮 面向对象
吃狗粮 非面向对象
Java与c++区别:
1.简单性:没有指针,头文件,结构,联合、操作符重载(operator) 虚基类等。
2.面向对象:都是面向对象,但是java没有多继承,但是接口可以实现多继承,Java提供了运行时自省功能。(什么是与运行时自省功能)
3.健壮性:
4.安全性:防范常见的各种攻击
5.可移植性:基本数据类型的大小以及有关运算都做了明确说明。Java中int永远是4字节(32)位,而在C++中int 可能是2字节或4字节,也可能是编译器指定商指定的其他大小,在Java中,数据类型具有固定的大小,消除了代码移植时存在的问题。
6.多线程
7.动态性:与c++相比功能具有动态性,它能够不断适应发展的环境,库中可以不断添加新方法和实例变量,而对客户端没有影响。
发展史:Java语言起源于1991年Sun公司的Oak项目,1995年正式命名为java
1996年1月 Java1.0发布,提供了可解释执行的Java虚拟机。
1997年2月Java1.1发布,反射,接口,类的关系
1998年12月 Java1.2 使用Just in time编译技术,语言的可迁移性好执行效率最优,Collections集合类设计优良
2006年Java 6 ,Java开源
2009年Oracle收购Sun公司
2014年,Java8 Lambda表达式。函数式编程能力。
J
ava是一门半编译,半解释型语言。先通过javac编译程序吧源文件进行编译,编译后生成的.class文件是由字节码组成的平台无关,面向JVM的文件,最后启动Java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
主类和主方法
Test.java–是源文件,源文件必须与主类名(public class )保持一致,一个源文件只能有一个主类 ,主方法存在与主类中。
Test.java 源文件
主类:public class Test
主方法 : public static void main(String[] args)
Java程序编译–执行流程
编译:javac Test.java —>Test.class(二进制文件)(若程序中出现中文,可以加上 -encoding UTF-8)
解释:java Test(主类名称)
命令行向主方法传参 java 主类名称 参数1 参数2 (参数1是args[0],参数2是args[1])
JDK JRE
JDK:java开发工具包,包含JRE,多了编译器javac 以及调试工具 JConsole、jstack,针对java程序员;
JRE: java运行时环境,包含JVM以及Java核心类库,是运行Java程序的环境,针对使用Java程序的客户;
JVM: java虚拟机,(Java移植性的关键)
标识符:数字,字母,_、$,不能以数字开头,不能是关键字。
数据类型
int
在java中,任何一个整型常量都是int类型。
整型溢出:
public class Int
{
public static void main(String[] args)
{
//int 的包装类是Integer
int maxValue=Integer.MAX_VALUE+1;//整型最大值+1,会溢出
int minValue=Integer.MIN_VALUE-1; //整型最小值-1,会溢出
System.out.println(maxValue);
System.out.println(minValue);
}
}
到达整型最大值或最小值后,需要转换数据类型:
int maxValue=Integer.MAX_VALUE;
int minValue=Integer.MIN_VALUE;
long max=maxValue+1;
long min=minValue-1;
System.out.println(max);
System.out.println(min);
结果依然是溢出,是因为执行顺序是从右向左,右边是int类型相加,这时已经溢出,那么max里存的就是溢出值。
解决方法如下:
long maxValue=Integer.MAX_VALUE+1L; //int 和long相加,int会自动提升成long
long minValue=(long)(Integer.MIN_VALUE-1); //强转为long
Java中小的数据与大的数据做数值运算,小的数据类型会自动提升为大的数据类型
,当把I(int)声明为long(在数字后加L或l,但推荐使用L,如num=11+1l=12,而不是22,推荐写成11+1L,不容易造成混淆)。
在java中,大的数据转换为小的数据,必须强转,但会造成数据丢失。
long num = 2147483648L;
int result = (int) num; //需要强转
int 和byte
//整型常量在byte范围内
byte a=120; //byte取值范围是 -128-127
System.out.println(a); //120
//整型常量不在byte范围内--》需要强转
//byte b=130;// 错误(从int转换到byte可能会有损失)
byte b=(byte)130; //强转为byte
System.out.println(b); //-126
byte c=(byte)300;
System.out.println(c); // 44 取的是300的低吧8位即44
//整型变量--》需要强转
int num=12;
//byte d=num; //错误(从int转换到byte可能会有损失)
byte d=(byte)num;
System.out.println(d); //12
整型常量若在byte类型的保存范围内,可以直接赋给byte变量,不用强转;
整型常量若不在byte类型的保存范围内,必须强转;
整型变量无论值是否在byte范围内,都需要强转;
上述只限于int 和byte。
对于int 和byte取值范围可参考这篇博客:
https://blog.csdn.net/sophia__yu/article/details/81143145
默认值
在最上面一张图,有各个类型变量的默认值,但是默认值需要结合类来观察,主方法中变量必须先赋值再使用,在主方法中不存在默认值否则会报错;
public class Int
{
public static void main(String[] args)
{
int value; //错误
System.out.println(value);
}
}
解决办法如下:
public class Int
{
int value;
public static void main(String[] args)
{
Int i1=new Int(); //需要结合类来看
System.out.println(i1.value); //0
}
}