java程序编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样
跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM
就业方向:
Web开发
Web开发语言很多,Java是其中之一。Java在开发高访问、高并发、集群化的大型网站方面有很大的优势,例如人人网、去哪儿网、美团等。
JDK所提供的部分工具:
- java编译器:javac.exe
- java解释器:java.exe
- java文档生成器:javadoc.exe
- java调试器:jdb.exe
环境变量的设置
- JAVA_HOME:设为JDK的安装路径
- Path:使得系统可以在任何路径下识别java命令
- CLASSPATH:Java运行环境加载类的路径,只有类在classpath中,才能被识别和加载
Java 中的主运行方法,它和 C/C++中的main()作用是一样的,就是所有的程序都从“main()”中开始执行。要执行 Java 程序,必须有一个包括主运行方法的类。
java中常用的几个包介绍:
包名 | 说明 |
---|---|
java.lang | 该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。 |
java.util | 该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 |
java.io | 该包通过文件系统、数据流和序列化提供系统的输入与输出。 |
java.net | 该包提供实现网络应用与开发的类。 |
java.sql | 该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。 |
java.awt | 这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。 |
javax.swing | |
java.text | 提供了与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 |
注意:
- import 只能导入包所包含的类,而不能导入包。
- 为方便起见,我们一般不导入单独的类,而是导入包下所有的类,例如 import java.util.*;
Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;)
System 类位于 java.lang 包
Java中共有8种基本数据类型,包括4 种整型、2 种浮点型、1 种字符型、1 种布尔型,请见下表。
数据类型 | 说明 | 所占内存 | 举例 | 备注 |
---|---|---|---|---|
byte | 字节型 | 1 byte | 3, 127 | |
short | 短整型 | 2 bytes | 3, 32767 | |
int | 整型 | 4 bytes | 3, 21474836 | |
long | 长整型 | 8 bytes | 3L, 92233720368L | long最后要有一个L字母(大小写无所谓)。 |
float | 单精度浮点型 | 4 bytes | 1.2F, 223.56F | float最后要有一个F字母(大小写无所谓)。 |
double | 双精度浮点型 | 8 bytes | 1.2, 1.2D, 223.56, 223.56D | double最后最好有一个D字母(大小写无所谓)。 |
char | 字符型 | 2 bytes | 'a', ‘A’ | 字符型数据只能是一个字符,由单引号包围。 |
boolean | 布尔型 | 1 bit | true, false |
不像 C/C++,Java 不支持无符号类型(unsigned)。
float 类型有效数字最长为 7 位,有效数字长度包括了整数部分和小数部分
注意:每个float类型后面都有一个标志“F”或“f”,有这个标志就代表是float类型
double 类型有效数字最长为 15 位。与 float 类型一样,double 后面也带有标志“D”或“d”
注意:不带任何标志的浮点型数据,系统默认是 double 类型。
C语言没有布尔型 :
在C语言中,如果判断条件成立,会返回1,否则返回0
但是在Java中不一样,条件成立返回 true,否则返回 false,即布尔类型
自动数据类型转换
操作数1类型 | 操作数2类型 | 转换后的类型 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
Java中没有像C语言中的scanf()语句,从控制台获取输入有点麻烦,使用 Scanner 类
与C、C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new
数组的初始化
你可以在声明数组的同时进行初始化(静态初始化)
也可以在声明以后进行初始化(动态初始化)
// 静态初始化
// 静态初始化的同时就为数组元素分配空间并赋值
int intArray[] = {1,2,3,4};
String stringArray[] = {"微学苑", "http://www.weixueyuan.net", "一切编程语言都是纸老虎"};
// 动态初始化
float floatArray[] = new float[3];
floatArray[0] = 1.0f;
floatArray[1] = 132.63f;
floatArray[2] = 100F;
与C、C++不同,Java对数组元素要进行越界检查以保证安全性
Java提供了”增强版“的for循环,专门用来遍历数组(也被称为”foreach循环“)
- for( arrayType varName: arrayName ){
- // Some Code
- }
arrayType 为数组类型(也是数组元素的类型);varName 是用来保存当前元素的变量,每次循环它的值都会改变;arrayName 为数组名称
eg:
1 int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100}; 2 for(int x: arrayDemo){ 3 System.out.println(x + ", "); 4 }
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同
String字符串与数组有一个共同点,就是它们被初始化后,长度是不变的,并且内容也不变。如果要改变它的值,就会产生一个新的字符串
StringBuffer类和String类一样,也用来表示字符串,但是StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,在内存使用上要优于String。
StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。
StringBuffer不像String,只能通过 new 来创建对象,不支持简写方式
StringBuilder类
StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。
线程安全:
- StringBuffer:线程安全
- StringBuilder:线程不安全
使用环境:
- 操作少量的数据使用 String;
- 单线程操作大量数据使用 StringBuilder;
- 多线程操作大量数据使用 StringBuffer
构造方法的名称必须与类的名称相同,并且没有返回值。
在Java中,使用new关键字来创建对象,一般有以下三个步骤:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字new来创建一个对象。
- 初始化:使用new创建对象时,会调用构造方法初始化对象。
ava支持四种不同的访问权限:
修饰符 | 说明 |
---|---|
public | 共有的,对所有类可见。 |
protected | 受保护的,对同一包内的类和所有子类可见。 |
private | 私有的,在同一类内可见。 |
默认的 | 在同一包内可见。默认不使用任何修饰符。 |
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
继承使用 extends 关键字
单继承性:Java 允许一个类仅能继承一个其它类,即一个类只能有一个父类,这个限制被称做单继承性。后面将会学到接口(interface)的概念,接口允许多继承。
注意:构造方法不能被继承,掌握这一点很重要。 一个类能得到构造方法,只有两个办法:编写构造方法,或者根本没有构造方法,类有一个默认的构造方法。
super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类。
- 覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
- 覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
- 覆盖方法不能比原方法抛出更多的异常。
- 被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
- 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
- 被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
覆盖和重载的不同:
- 方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
- 方法覆盖要求返回类型必须一致,方法重载对此没有要求。
- 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
- 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
- 父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。
多态性带来了一个问题,就是如何判断一个变量所实际引用的对象的类型 。
C++使用runtime-type information(RTTI),Java 使用 instanceof 操作符。
instanceof 运算符用来判断一个变量所引用的对象的实际类型,注意是它引用的对象的类型,不是变量的类型
在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”
很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型。程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性。
注意:不能直接将父类的对象强制转换为子类类型,只能将向上转型后的子类对象再次转换为子类类型。也就是说,子类对象必须向上转型后,才能再向下转型
静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。
关于静态变量和静态方法的总结:
- 一个类的静态方法只能访问静态变量;
- 一个类的静态方法不能够直接调用非静态方法;
- 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;
- 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;
- 静态方法不能被非静态方法覆盖;
- 构造方法不允许声明为 static 的;
- 局部变量不能使用static修饰。
final 所修饰的数据具有“终态”的特征,表示“最终的”意思。具体规定如下:
- final 修饰的类不能被继承。
- final 修饰的方法不能被子类重写。
- final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次。
- final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
- final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来
注意:
- equals()方法只能比较引用类型,“==”可以比较引用类型及基本类型。
- 当用 equals() 方法进行比较时,对类 File、String、Date 及包装类来说,是比较类型及内容而不考虑引用的是否是同一个实例。
- 用“==”进行比较时,符号两边的数据类型必须一致(可自动转换的数据类型除外),否则编译出错,而用 equals 方法比较的两个数据只要都是引用类型即可。
在 Java 中,允许在一个类(或方法、语句块)的内部定义另一个类,称为内部类(Inner Class),有时也称为嵌套类(Nested Class)。
到这里了,下次继续吧。累了。。