疯狂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关键词的使用

  在使用的时候,如要在类外部调用的方法、变量都需要加上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:

  多态没能理解透彻,待深入

  接口的权限修饰符未能理解透彻,待深入

  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关键词的使用

  在使用的时候,如要在类外部调用的方法、变量都需要加上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,在程序运行期间,全局常量的值都不会被改变。