你的位置:首页 > Java教程

[Java教程]JAVA中一些需要记录的知识点(基础部分)


为了准备一年以后的校招,开始重头在复习一遍JAVA,为了方便初学者或者其他在整理基础知识的朋友,发个日志,欢迎讨论,并指出错误,谢谢!
 
 
 
JDK与JRE的区别:
JRE是所有JAVA程序运行所需要的环境,任何JAVA程序的运行都依赖于JRE,当前从JAVA官网选择安装JAVA即安装的是JRE。
JDK是为开发人员所提供的工具包,对开发人员来说属于必备项,一般在JDK本身包含JRE,但是一般JDK还会再安装一套JRE,这一套JRE被成为公共JRE(如图),JDK需要从oracle的官网下载。

当前的主流编辑器,如eclipse会找到JRE和JDK的位置,当然也可以再进行手工修改。
 
JAVA所需环境变量说明:
PATH:(必需)指定编译、运行java程序是所需要的程序所在路径,一般在jdk安装目录(注意是JDK!!!和JRE是不一样的!!!)下的bin文件夹中。目前常用的设置办法是先定义一个JAVA_HOME变量,在PATH中引用JAVA_HOME:%JAVA_HOME%/bin;
CLASSPATH:(之前必需,现在非必需)设置Classpath的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程序(.class文件),现在已经不需要;
JAVA_HOME:(理论上非必需,实际必需)设置一个变量存放java程序运行所需要的程序所在路径,方便在其他地方进行引用(不用再输入一长串路径,直接使用JAVA_HOME变量即可),同时,现在不少软件也会直接调用JAVA_HOME变量,不设置容易出错。
 
1.java主要结构阐述
java中每一个.java文件都是一个类,一个java工程由许许多多的.java文件组成,也就是由java类组成。一般而言一个java类中主要的结构如下:
1.包申明:java类在本工程中属于哪个包,即在工程中的位置;
2.导入的包:外部库,工具;
3.公共类体(或接口)定义:类名与java文件的名称必须相同,类中内容即java文件的主要内容
4.其他:其他类的定义和接口定义。
java项目中,由外至内分别为:source文件夹、包(package)、类(.java,就是上面bb了半天的那个东西),经过编译后会将编译后的类(.class)放在与source文件夹同级的bin文件夹中。不同的source floder 中的package可以同名,相同的package中的 类 不能同名(在两个不同source floder中的相同package中也不行)
 
2.基本数据类型
基本数据类型8中:整型4种、浮点2种、字符、布尔;
btye最大128-1;short最大32768-1;int包含最大2开头的10位数;数值计算注意整型数值范围,记得加转换符;long数据在赋值时若整数的数值超出int的最大范围则要在整数后面加上l说明;
浮点型对于float的赋值要在小数后面加f说明;
单纯的字符型变量相加(即每个元素都是字符变量(PS.加入整形也是ascii码相加))等于把各个字符的ascii码相加;(与字符串的加法运算不同!!!字符和字符串相加得到的是字符串)
 
3.基础包装类
基础的常用的包装好的类有7种(一定注意大小写!!!):String、Integer、Boolean、Byte、Character、Double、Number;
 
4.类型转换:
char、int、double等之间可以用强制转换的方式转化,如(int)‘a’,(char)25;boolean类型变量无法由强制转换得到
各个变量与各个类之间的转换,需要通过调用各个对象的方法来实现。如:整形、字符型向String对象转换,可以使用String.valueOf();
 
5.常量赋值:
全局常量初始化时必须赋值;局部常量初始化时可以不赋值,但是只能赋值一次。
 
6.变量有效范围:
全局变量分为实例变量和静态变量(static),静态变量可以在其他类中使用 类名.变量名 的方式使用,实例变量只可在本类中使用。
局部变量只在定义变量的代码块中有效,即{}两个大括号之间,从变量申明开始算。
与局部变量同名的全局变量,在局部变量的使用范围内失效。
 
7.switch与if elseif的区别
两者可实现相同的功能,但从逻辑上说,if elseif必须对匹配项前面的每一个项都执行检查,而switch通过一定的查找办法去查找匹配项。在需要检查的项较多时,switch效率更高,switch另一个优势是代码清晰,但缺点是难以进行复杂操作。
 
8.使用foreach循环方式
使用foreach循环方式可以快速的遍历数组、对象等,具体方式:for(int x : arr){操作},但需要注意foreach形式无法对数据进行写入
 
9.String对象常用方法记录(按个人理解的常用程度排序,参数和具体用法未说明)
length()获取字符串长度;
equals()判断字符串的内容是否相同,注意,不能直接使用等号比较,使用等号会比较内存中的位置!!!!!
replace()字符串中的子串替换;
split(),将字符串按给定的符号进行分割,保存在数组中;
toCharArray(),将字符串转换为字符数组;
trim()去除字符串前后的空格,注意,不对字符串进行更改,而是返回相应副本;
substring()截取字符字串;
toLowerCase(),toUpperCase()进行字符串的大小写转换;
indexOf(),lastIndexOf()在字符串中查找子串位置;
charAt()返回字符串中指定位置的字符;
startsWith(),endsWith()判断字符串的开始和结尾是否为指定字符串;
compareTo(),按字典顺序比较字符串;
 
10.Arrays对象常用方法记录(按个人理解的常用程度排序,参数和具体用法未说明)
Arrays.fill(),填充数组,可用于数组初始化、赋值;
Arrays.sort(),对数组进行排序;
Arrays.copyOf(),Arrays.copyOfRange对数组进行复制;
 
11.注意static关键词的使用
具体解析见技术博客:http://www.cnblogs.com/dolphin0520/p/3799052.html
在使用的时候,如要在类外部调用的方法、变量都需要加上static限制符,而带有static限制符的类(方法)若需要调用其他方法或全局变量,那么被调用的方法和全局变量也必须有static修饰(这是因为非静态变量必须要创建实例才能被调用)。一般用于不需要创建实例的类(方法),例如用作工具的类。
要区分static与权限修饰符的区别,static的目的是,在不创建实例的情况下也可使用static变量和方法,而权限修饰符则规定了该方法与变量的使用范围。
 
12.Java的集合类保存数据说明
Arraylist、HashMap等集合类是java中的一个特色, 但在其中只能保存引用型的数据,不能保存基本数据。即:Integer可以但int不行。
 
13.对于class的权限修饰符说明
对于顶级类(包内部第一层的类)来说,只有public修饰符可用,表示可跨包使用该类,若不用public则默认在该包内可用,一个.java文件中使用public的类至多存在一个。对于顶级类的内部类,其权限修饰符为private、protected、public与默认。
关于内部类的权限问题需要深入研究(比如内部类中存在private变量,需要在外部类的内部使用该变量等情况),此处暂时跳过。
 
14.判断一个类的两个对象是否相等
除了基础变量,引用变量(对象)不能使用两个等号==去判断值是否相等(一个类生成的两个对象是否相等),需要使用equals方法。但注意的是,一般用户定义的类的equals方法内部都是使用双等号判断的,要实现判断的效果还需要用户重载equals。(就是自己写一个方法判断)
 
15.基本变量对应的包装类中可能常用的方法
Integer
equals(),比较两个integer对象的值是否相等
byteValue(),intValue(),shortValue(),返回对应类型的值
toString(),将Integer对象转换为String对象(toBinaryString()、toHexString()、toOctalString()同理)
Integer.valueOf(),将String对象转换为Integer对象
Integer.parseInt(),将String对象转换为int变量。
Boolean
Byte
Character
Character.inUpperCase()、Character.inLowerCase(),判断是否为大写、小写字符
Character.toUpperCase()、Character.toLowerCase(),转换为大写、小写字符
toString(),将字符转化为字符串
Double(Float可以参考Doubel,方法是一样的)
intValue(),返回整形变量
toString(),返回字符串
Double.valueOf(),将String对象转换为Double对象
 
总结:需要进行基础类的转换时,可使用toString()转换成字符串,再将字符串用各个类的valueOf转换为需要的类。
 
16.常用数学计算方法
DecimalFormat类
当中的各个方法对数字进行格式化,得到的是字符串;
Math类
三角函数方法,可进行各类三角函数计算,包括弧度角度互换
指数函数方法,平方、平方根、立方、立方根方法等
取整函数方法,向上、向下取整,最近取整
最大值最小值绝对值
随机数方法(产生0到1之间的任意double型数值)
Random类
nextInt()返回一个整数、nextLong()返回一个长整型、nextBoolean()返回一个布尔变量、nextFloat()返回一个浮点数
 
17.关于方法重写(不同于重载!!!!)
重写方法时,可以修改方法的修饰符、返回值类型(参数类型、个数不可变),大多数情况下父类中的final方法不可重写(private final在子类中不可见,可重写,是比较特殊的情况)
子类方法对父类方法重写时,子类方法的修饰符必须比父类方法的修饰符权限更大;
子类对父类方法从重写时,若要修改子类方法中返回值类型,该类型必须是父类中同方法返回值的子类;
 
18.关于方法重写与重载的区别
在同一个类中,方法无法重写,即在一个类中不能存在两个相同方法名、参数个数、参数类型的方法,在同一个类中,方法可以重载,即一个类中允许多个相同的方法名,不同的参数类型、参数个数的方法存在。方法的重写涉及到父类、子类至少两个类,若要重写,不能修改方法的参数类型和个数,方法的重载只在一个类中发生,若要重载,必须要修改参数类型、个数。所有的父类中的方法都会在子类中被继承,所以父类与子类中存在两个方法名相同、参数不同的方法时,可以看作先被继承,后被重载。
 
19.抽象类(abstract关键字)
抽象类只能被继承,没有其他任何功能,而抽象类中的抽象方法在被继承后必须要进行重写,抽象方法没有方法体。若类中含有抽象方法,则该类必定为抽象类。
 
20.接口
接口(interface)的权限修饰符(待解决),接口中的方法均为public且不含方法体需要继承后重写,
先不管原理谈应用,接口一般使用public修饰,不加public的接口只能在同包中的不同类中使用(依然是默认的protected),加上public的接口才能跨包使用,但是只有与.java名称相同的interface才能使用public。而在接口内部,除去static、default方法,其他方法均不能有方法体。
 
21.对象的转型
对象转型分为向上转型和向下转型,子类对象可以一直向上转型(会自动转型),父类对象的转型要考虑其是否属于子类对象才能转(需要强制转型)。如:A a = new B();,B为A的子类,则最终a当作A类型的对象,但本质上仍是B类,父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了,即a可以调用B类型中从A类继承到的方法和属性,但不能调用B类中独有的方法和属性。在方法调用时同理,假设C继承于B继承于A,则C类型对象c在调用类中某一方法时,会在可用范围内(可用范围参考上一句)先查找以C类型为参数的方法重载版本,若不存在,则向上转型为B并查找B类型为参数的方法重载版本,直至找到可执行的方法重载版本,若不存在,则无法调用,会报错。
 
22.关于类包
在实际开发中,应为所有的类指定类包,包的声明必须是文件中第一行非注释代码,所有类包均为小写字母构成。导入包时,若使用*来导入包中的所有类,则并不会导入子类,如需要导入子类还需要重新import。使用import static 可以导入类当中的静态成员。
 
23.关于常量
final定义的常量分类局部常量和全局常量,局部常量在其生命周期内不能重定义,但是需要的话可在每次创建的时候都可以赋新值,全局常量一般使用public static final,在程序运行期间,全局常量的值都不会被改变。
 
PS:
多态没能理解透彻,待深入
接口的权限修饰符未能理解透彻,待深入