目录标题
如何学Java
1,基本功扎实-----编程基本功,编程能力;
2,学会查找doc文档,依靠文档而不是依靠人脑记忆;
3,背代码,这是编程最重要的,背会经典的代码套路,背会了才会写程序;
4,积累解决问题的能力;
Java学习路径
java基础程序设计:数据类型、控制语句、数组、方法;
面向对象程序设计:封装、继承、多态、设计模式、异常、包;
Java新特性:泛型、枚举、装箱,拆箱、可变参数、Annotation;
应用程序开发:类集、二叉树、链表、类库、多线程、IO、反射、网络、JDBC/Oracle,MySQL。
java基础程序设计
Java发展概述;
Java开发环境搭建;
简单Java程序;
Java数据类型;
运算符、表达式、语句、判断、循环;
数组的定义及使用、方法的定义及使用、数组的引用传递、Java新特性对数组的支持;
JVM基本原理?:
JVM基本原理也就是Java可移植性特性的实现原理,也就是一个java程序的执行流程、运行过程。
可移植性就是指一个程序可以在多个平台执行,而不改变程序本身,即,一次编程N次运行;
Java是编译解释型语言,编译器会把Hello.java源文件编译成Hello.class中间字节码文件,JVM读取并处理的就是这个经编译过的平台无关的字节码class类文件。
Java编译器javac.exe针对Java虚拟机产送class类文件,因此是独立于平台的;
Java解释器java.exe负责将java虚拟机的代码在特定平台(Linux、Windows、Unix、DOS)上运行。
最后机器执行的都是0101010的机器语言或者叫机器码指令。机器也只认识0101的机器码指令。
总结:
1,编译器将*.java源文件编译成 *.class字节码文件;
2,JVM加载*.class 类文件;
3,解释器解释*.class字节码文件成为机器码,交给操作系统执行。
(但是准确的说解释器并不会直接把字节码文件解释成机器语言,其实会解释成汇编语言,然后汇编再进一步解释成机器语言)
path、classpath作用?
path的主要作用是设置JDK的可执行命令;
classpath主要在执行的时候起作用, 高速JVM类的保存路径,也就是 *.class文件的保存路径。所以classpath只对java解释命令起作用,对javac编译命令不起任何作用。
class与public class声明的区别?
public class声明的类文件名必须与类名称一致;
class声明的类文件名称可以与类名称不一致;
在一个java文件中只允许有一个public class声明,但是可以有多个class声明;
在一个java文件中允许有多个class类定义,编译后会自动划分不同的class文件;
常量、变量
常量就是定义不可改变的值;
变量是指一块内存区域,可以改内容的一块区域;
标识符命名规则
英文大小写字母、数字、下划线、美元符号组成,但是不能已数字开头;
3种注释
单行、多行、文档注释;
java 数据类型划分
数据溢出
通过扩大数据类型来解决。
数据类型之间的转换
自动类型转换、强制类型转换。
任何类型的数据都可以向String转型;
运算符、表达式、语句
java中语句有很多种形式,表达式就是其中一种形式,表达式是由操作数和运算符组成,操作数可以是常量、变量也可以是方法,运算符就是数学中的运算符号;
表达式后面加分号就是语句。
赋值运算符(=)
一元运算符(+、-、!)
算数运算符(+、-、*、/、%)
关系运算符(>、<、>=、<=、==、!=)
自增自减运算符(++、--)
逻辑运算符(&(AND与)、|(OR或)、&&(短路与)、||(短路或))
位运算(
&(按位与)、
|(按位或)、
^(异或--相同为0不同为1)、
~(取反:负数取反、正数取反 )、
<<(左移位)、
>>(右移位)、
>>>(无符号右移位))
正数取反是负数,负数取反是正数。
正数的原码、反码、补码相同;
补码=反码+1;
正数取反
先将初始数值转换成二进制数,再对二进制数的每一位(包括第一位的符号位)进行运算:即将0变为1、将1变为0。得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,就能得到计算结果。
【例1】对 5 进行取反。
假设为16位。
5 转换为二进制数 为: 0000 0000 0000 0101得到二进制数
每一位取反: 1111 1111 1111 1010得到最终结果的补码
取补码: 1000 0000 0000 0110得到最终结果的原码
转换为十进制数:-6
正数的原码、反码、补码相同
则 5 取反为 -6 .
负数取反
先将初始数值转换成二进制数,再取得二进制数的补码,之后对补码的每一位(包括第一位的符号位)进行运算:即将0变为1、将1变为0。得到的是最终结果的补码(到达这一步后所得的二进制数为正数,由于正数的原码、反码、补码相同,后面的运算可以忽略,视此步得到的为最终结果的二进制数),要转换为最终结果的原码则需再次取补码,就能得到计算结果。
【例2】对 -5 进行取反。
假设为16位。
-5 转换为二进制数为: 1000 0000 0000 0101得到二进制数
取补码: 1111 1111 1111 1011得到二进制数的补码
每一位取反: 0000 0000 0000 0100 得到最终结果的补码
取补码: 0000 0000 0000 0100得到最终结果的原码
转换为十进制数:4
则 -5 取反为 4 .
简便方法
也可以用适合人类运算的计算方法:
如对 a 按位取反,则得到的结果为 -(a+1) .
此条运算方式对正数负数和零都适用。
程序的结构
-
顺序结构
-
选择结构
if-else 、if-else if-else 、三目运算符、switch -
循环结构
for 、while、do-while、
中断循环:break(退出整个循环)、continue(退出当前这次的循环)
数组与方法
· 数组的定义、作用和使用
空指针nullpointException,数组下标越界ArrayIndexOutOfBoundsException;
· 数组的声明及内存分配
数组的动态初始化、静态初始化;
数组声明:声明数组是在栈内存中声明的,
为数组开辟空间:使用关键字new在堆内存中开辟,
· 多维数组
数组名.length 求出数组长度;
数组的操作,主要控制好其小标即可;
·方法的作用、定义格式
·方法的重载的概念及使用
方法名称相同,但是参数类型和参数个数不同,称为重载。
通过传递参数的个数以及类型的不同以完成不同功能方法的调用。
注意事项:方法的重载一定只是在参数上的类型或者个数不同,不能根据返回值类型来判断;
方法的参数相同,但是返回值类型不同,则根本不是重载,编译都是无法编译过的。
·使用return结束一个方法
·方法的递归调用
方法自己调用自己,必须有明确的结束条件,结束调用。
数组的引用传递
·掌握数组的引用传递
数组作为一个方法的参数,和基本数据类型作为一个方法参数的区别?
·使用方法接收或者返回一个数组
一个方法可以接收一个数组也可以返回一个数组,如果方法接收一个数组的话,则此方法对数组所做的修改将都被保留下来。
内存状态分析。
·java对数组操作的支持
排序:java.util.Arrays.sort(数组引用); //默认是从小到大的排序
数组拷贝:System.arraycopy(原数组名称,原数组开始点,目标数组名称,目标数组开始点,拷贝长度);
数组的引用传递,传递的就是对内存的使用权,可以将一个数组传递到方法之中,传递的时候不需要写[]
,直接写数组名字即可。
方法中对数组所做的修改,都会被保留下来。
java新特性对数组的支持
jdk1.5之后引入了大量的新特性。
·可变参数
方法中接收的参数不再是固定的,而是随着需要传递的,
可变参数的方法定义格式:返回值类型 方法名称(类型 … 参数名称){}
所有的可变参数接收之后都是以数组的形式保存下来的,所以直接按照数组的方式接收即可。
public class NewDemo01{
public static void main(String args[]){
System.out.print("不传递参数(fun()):") ;
fun() ; // 不传递参数
System.out.print("\n传递一个参数(fun(1)):") ;
fun(1) ; // 传递一个参数
System.out.print("\n传递五个参数(fun(1,2,3,4,5)):") ;
fun(1,2,3,4,5) ;
}
public static void fun(int ... arg){ // 可变参数
for(int i=0;i<arg.length;i++){ // 循环输出
System.out.print(arg[i] + "、") ;
}
}
};
foreach输出
数组的输出一般会使用for循环输出,在jdk1.5之后为了方面数组的输出,提供了foreach语法,
语法格式:
for(数据类型 变量名称:数组名称){}
public class NewDemo02{
public static void main(String args[]){
System.out.print("不传递参数(fun()):") ;
fun() ; // 不传递参数
System.out.print("\n传递一个参数(fun(1)):") ;
fun(1) ; // 传递一个参数
System.out.print("\n传递五个参数(fun(1,2,3,4,5)):") ;
fun(1,2,3,4,5) ;
}
public static void fun(int ... arg){ // 可变参数
for(int x:arg){ // 使用foreach输出输出
System.out.print(x + "、") ;
}
}
};