Java升级打怪第一周(Java核心语法)

一、Java基础

1.Java有什么优势?

    C最接近于硬件,适合嵌入式编程,操作系统用C编写

    Java适合于写软件,有封装、继承、多态、跨平台(生成.class文件,二进制级别)的优点

 

2.基本名词

   (1)JVM   虚构一个计算机,通过在实际的计算机上模拟仿真实现各种计算机的功能。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上可以运行

                        的目标代码(字节码),所以可以不加修改的在多个系统上运行。

   (2)JDK   Java开发工具包,是Java的核心,包括了Java的运行环境、Java工具、Java基础类库

   (3)JRE   Java的运行环境

   (4)GC    Java中的垃圾回收机制,不必担心内存泄漏

   (5)JavaSE:标准版的Java。是我们比较常用的一个版本。从Java5.0开始,改名为JavaSE,主要用于桌面应用软件开发。

   (6)JavaEE:企业版。JavaEE是J2EE的新的名称。主要用于分布式网络程序的开发。

   (7)JaveME:主要用于机顶盒或者移动电话,或者PDA之类的嵌入式消费类电子设备

 

3.OOP

    (1)继承:Java中没有多继承,要用接口(一个类可以实现多个接口)或者间接继承实现,子类会继承父类所有非私有属性和方法

    (2)向上造型:父类引用可以指向子类对象,父类引用无法调用子类的方法(父类是子类的,子类的不是父类的)

    (3)重载与重写

             a. 重载:在同一个类的内部,函数名相同但是参数列表不一样(参数的个数不一样或者参数的类型不一样)的多个方法就构成了重载方法。


             b. 重写:在子类中拥有与父类同名的方法。只有遵循了“两同两小一大”规则的方法才构成重写。

             “两同”指的是方法名相同,形参列表相同;

             “两小”指的是子类方法的返回值应该比父类方法的返回值类型相同或者更小,子类方法声明抛出的异常类型应该比父类抛出的异常更小或者相同;

             “一大”指的是子类方法的访问权限应该比父类的访问权限相等或者更大

    (4)this和super的用法

             a. this关键字:是自身的一个对象,代表对象本身,可以理解为指向对象本身的一个指针,必须在非静态方法中使用,有以下几种用法:

                   代表自身类的对象;函数参数或者函数中的局部变量和成员变量同名,引用成员变量;调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)

             b. super关键字:可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

                 调用父类中的某一个构造函数(应该为构造函数中的第一条语句);子类与父类的成员变量同名,引用成员变量;

    (5)接口和抽象类

              在abstract class方式中,可以有自己的数据成员,也可以有非 abstract的成员方法;

              而在interface方式的实现中,只能够有静态的不能被修改的数据成员(不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。

 

二、编程规范

1.命名 :变量和方法名驼峰命名法,第一个单词的字母全部小写,从第二个单词开始首字母大写其他字符小写

2.不要出现魔幻数字

3.注意不要把成员变量直接给用户,设置接口,你永远猜不到用户会传入怎样的参数,所以一定要注意健壮性。例如:重写Cell类的equals方法

          public boolean equals(Object obj){
                  if(obj==null)
                   return false; 
                   if(this == obj)
                    return true;
                 if(obj instanceof Cell)
                   {
                         Cell cell = (Cell)obj;
                         if(cell.row == this.row && cell.col==this.col)
                         return true;
                         else
                         return false;
                   }
                }

4.文档注释

 (1)开头处:说明作者、时间、版本、要实现的功能的描述等信息

         /**

         *类的功能说明

         *@author zhong

         *@version  1.0

         *@see java.sql (参考信息)

         *@since JDK1.0

         */

  (2)方法注释

        /**

        *这个方法是输出......

        *@param  对变量进行说明

        *@return   对返回值进行说明

        *@throws  对抛出的异常的类型进行说明

        */

   (3)生成文档注释

        通过Javadoc工具,可以很方便的将源代码中的注释转换为HTML文档说明。

        操作步骤:在project下找到generate javadoc,在configure中加入JDK下bin里的javadoc.exe路径,即可生成在选定目录下。

 

三、JDK API

 1.经常使用的API:字符串操作、集合操作、文件操作、输入输出操作、网络操作、多线程操作

    为维护和使用方便,类库按包结构划分经常使用的包:

   (1)java.lang 基础库,如字符串、多线程等,使用频率高,不用导入包

   (2)java.io 文件操作、输入输出

   (3)java.util 常用工具包,如集合,随机数产生器,日历,时钟

   (4)java.net 网络操作

   (5)java.security 安全相关操作(明文传输比较危险)

   (6)java.text 处理文字、日期、数字、信息的格式

   (7)java.sql  数据库访问


2.核心API

(1)日期操作

 a.  Date以及常用API  
   Java中的时间:使用标准类库的Date类表示,是用距离一个固定的时间点的毫秒数(可正可负,long类型的)表达一个特定的时间点
   固定的时间点叫做纪元(epoch),是UTC时间1970年1月1日00:00:00
   UTC(universal time coordinated 世界调整时间)与GMT(Greenwich Mean Time格林威治时间)一样,是一种具有实际目的的科学标准时间   
 
   Date类简介
   java.util.Date类封装日期以及时间信息,常用方法为setTime以及getTime,Date类的大多数用于进行时间分量计算的方法已经被Calendar取代   
          eg:Date date = new Date();
                 //获取系统当前时间以及时间信息
                 long time = date.getTime();
                 //从1970年1月1日到现在所经过的毫秒数,long类型

b. SimpleDateFormat
    java.text.SimpleDateFormat是一个以跟语言环境有关的方式来格式化和解析日期的具体类。这个类允许进行格式化日期文本)也允许解析文本日期和规范化
      构造方法
      SimpleDateFormat()
      SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
      方法
      final String format(Date date) Date->String
      Date parse(String source) throws ParseException   String->Date

    日期模式匹配字符
    字符        含义  
    y        年
    M        月
    d        日
    E        星期  Sun
    a        AM或者PM
    H        24小时制的小时
    h        12小时制的小时
    m        分钟
    s           秒

    将String格式化为Date
    String str="2012-12-12";
     SimpleDateFormat sdf = new  SimpleDateFormat("yyyy-MM-dd");
     Date date = sdf.parse(str);
     println(date);

c. Calendar类: java.util.Calendar类是用于封装日历信息,其主要作用在于其方法可以对时间分量进行计算
    Calendar是抽象类,其具体子类需要针对不同国家不同地区的日历系统。其中应用最广泛的是GregorianCalendar(格里高里历,也就是通用的阳历),对应世界上绝大多数国家以及地区使用的标准日历系统

    getInstance方法:该方法获取Calendar类型的一个通用对象,该方法返回一个Calendar对象,其日历字段已经由当前日期和时间初始化
    Calendar c = Calendar.getInstance();
    eg: GregorianCalendar c1 = new GregorianCalendar(2017,Calendar.March,...) //月份要用类里面定义的静态常量

    获取日期及时间分量
    设置日期及时间分量

 
    int getActualMaximum(int field) 给定次Calendar的时间值,返回指定日历字段可能拥有的最大值

    add方法
    setTime以及getTime 

(2)集合操作

   Collection:在实际开发中,需要将使用的对象存储于特定的数据结构的容器中。JDK就提供了这样的容器--Collection(集合)
   Collection是一个接口,定义了集合相关的操作方法,其有两个子接口:List和Set。 List:可重复集, Set:不可重复集(调用equals()方法比较的结果判断元素是否重复)

    集合持有对象的引用: 集合中保存的时引用类型元素,并且集合值保存每个元素对象的引用,而不是将对象本身存入集合中。     

    boolean add(E e):用于向集合中添加新元素。该方法会将给定的元素添加到集合中,如果添加成功则返回true,否则返回false。


    java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍
    a.集Set:
    HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的.
    TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用 了一个TreeMap.
    b.列表List:
    Vector: 实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样 。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类??当两个或多个线程同时访问时也是性能良好的。
     Stack: 这个类从Vector派生而来,并且增加了方法实现栈??一种后进先出的存储结构
     LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。
     ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。
    c.映射map:
    Hashtable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类 是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
    HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
    WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象 中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。
    TreeMap: 实现这样一个映象,对象是按键升序排列的。

四、字符串

1.String:不可变对象(字符串一旦被创建,对象永远无法被改变,但是字符串引用可以重新赋值)

 (1)  String常量池:java为了提高性能,将所有静态字符串(字面量、常量、常量连接的结果)在常量池中创建,并尽量使用同一对象,重用静态字符串。

                                        对于重复出现的字符串,JVM首先在常量池中查找,如果存在则返回对象

 (2)  内存编码:采用unicode编码,任一字符对应两个字节的定长编码(可以表示中文)

 (3)  常用API :

          a. 字符串中是否包含某一个子串。
                   boolean contains(str):该方法只可以判断
                   indexOf(str):可以索引str第一次出现为止,如果返回-1,表示该str不在字符串中存在。该方法既可以判断,也可以获取出现的位置.

          b.字符串的前缀和后缀

                   boolean startsWith(str):字符串是否以指定内容开头

                   boolean endsWith(str):字符串是否以指定内容结尾

          c.消除空格

                   trim( ):忽略前导空格和尾部空格,返回字符串的副本

          d.判断字符内容是否相同
                   boolean equals(str):复写了object类中的equals方法。
                   boolean.equalsIgnorecase(str):判断内容是否相同,并忽略大小写。

                   compareTo(str) :按字典序比较两个字符串,返回第一个不相同字符的字典序之差

                   == 比较的是地址,而非内容

           e.替换    String replace(oldchar,newchar);

           f. 类型转换

               将字符数组转成字符串;
                       构造函数:String(char[])
                       String(char[],offset,count):将字符数组中的一部分转成字符串
                       静态方法:
                       static String copyValueOf(char[]);
                       static String copyValueOf(char[] data,int offset,int count);

               将字符串转成字符组;
                       char[] tocharArray();

               将字节数组转成字符串;
                       String(byte[])
                       String(byte[],offset,count):将字节数组中的一部分转成字符串
               将字符串转成字节数组;
                       byte[] getBytes()

               将基本数据类型转成字符串;
                      static String valueOf(int/double)


2. StringBuffer和StringBuilder:封装可变字符串,两者的用法相似,区别在于StringBuilder使用假设在单线程中,线程不安全,而StringBuffer多线程。

         StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

         public StringBuffer append(各种类型的数据 ):该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接

         public StringBuffer deleteCharAt(int index) : 该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串

         public StringBuffer delete(int start,int end):该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。

         public StringBuffer insert(int offset, 各种类型的数据)  :该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串

         public StringBuffer reverse():该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串

         public void setCharAt(int index, char ch) :  该方法的作用是修改对象中索引值为index位置的字符为新的字符ch

         toString()方法用于将StringBuffer转换为String

         replace()方法:同String类的replace方法不同,第一个参数指定被替换子串的起始位置,第二个参数指定被替换子串的终止位置,第三个参数指定新子串

          注意:StringBuilder的很多方法的返回值均为StringBuilder类型,方法的返回语句均为:return this;由于返回的都是当前对象,所以会在程序中看到一种简洁的书写方式
          e.g     str.append("softi").append("java").insert(1,"oracle").replace(0,4,"softi.com");

3.正则表达式

   (1)概念:由一串特殊字符串构成的一个规则字符串,是描述文本规则的工具。

             用途:在实际开发中,经常需要对字符串数据进行一些复杂的匹配、查找和替换等操作。通过正则表达式可以方便实现对字符串的复杂操作。

   (2)表示方法(参见http://www.cnblogs.com/lzq198754/p/5780340.html)

             [a-z] 表示a-z中的任意一个字符

             [^abc]  除了abc之外的任意一个字符

              .    任意一个字符

             \d   任意一个数字字符,等价于[0-9]

             \D  非数字字符

             \w  任意一个单词字符

             \W  非单词字符

             \s   空白字符

             X?  0个或1个X

             X*  0个或多个X

             X+  1个或任意多个

             X{n} 表示n个X
             X{n,} 表示大于或者等于n个X
             X{n,m} 表示n到m个X (m必须大于n)

             ()    表示分组,可以将一系列的正则表达式看成一个整体,可以用|表示或

             ^ $  表示字符串的开始和结束,对字符串从头到尾进行整体限制

    (3)正则表达式API

              matches(正则表达式) 方法:将一个字符串与正则表达式进行匹配,如果匹配成功则返回true,否则返回false
              /*检测邮箱地址是否合法*/
               public void email() {
                      String emailRegEx = "^[a-zA-Z0-9_\.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,4}$";
                      String email = "duansl@softi.com.cn";
                      System.out.print(email.matches(emailRegEx));
                    }

              split方法
              String的split方法可以将字符串按照特定的分隔符拆分成字符串数组
              String[] split(String regex) regex为正则表达式 以regex所表示的字符串为分隔符,将字符串分割成字符串数组
              拆分方法:str.split(",\\s*");

              replaceAll方法:用于字符串替换
              String replaceAll(String regex,String replacement) 将字符串中匹配正则表达式regex的字符串替换成replacement
                 /*将字符串中的所有数字替换成中文的“数字”这两个汉字*/
                public void testReplaceAll() {
                    String str="abcd1234efg123hij678";
                    str.replaceAll( "\\d+","数字");
                  }

 

五、类

1.Object类

(1)概念:在Java的继承中,java.lang.Object类位于继承的顶端,如果定义一个Java类时没有使用extends关键字声明其父类,则其父类默认为java.lang.Object
                      Object类型的引用变量可以指向任何类型对象
(2)toString方法:原则上建议每个类都重写toString方法,格式上大多数遵循"类的名字[域值]",如果不重写,将使用Object类的toString方法,其返回值为:类名@散列码
                                    Object类中的toString方法返回对象值得字符串表示
                                    Java中很多地方会默认调用对象的toString方法:字符串+对象 自动调用对象的toString方法;System.out.print(任意对象) ,会自动调用对象的toString方法
                                    toString方法是非常有用的调试工具。JDK中的标准类库中,许多类都定义了toString方法,方便用户获取相关对象状态的必要信息
(3)equals方法: Object类中的的equals方法用于检测一个对象是否等同于另一个对象,在Object类中,这个方法判断两个对象是否具有相同的引用,即是否指向相同的对象
                                    在实际应用中,一般也需要重写该方法,通过比较对象的成员属性,使该方法更有意义。


                                    public boolean equals(Object obj){
                                            if(obj==null)
                                             return false;  
                                           if(this == obj)
                                             return true;
                                            if(obj instanceof Cell)
                                            {
                                                Cell cell = (Cell)obj;
                                                if(cell.row == this.row && cell.col==this.col)
                                                   return true;
                                                    else
                                                 return false;
                                             }
                                         }

                                 注意:Object默认的equals方法的比较规则跟==是一样的


2.包装类
     (1)概念:Java中的八种基本数据类型byte,char,short,int,float,long,double,boolean都是以值的方式保存于内存中,而不是保存在对象中。它们不是Object的子类,所以不 能参与面向对象的开发。包装类(wrapper)就是用来将基本数据类型转换成相应对象的一种特殊类。包装类是不可改变的类,在构造了包装类对象之后,不允许更改包装在其中的值。包装类是final的,所以不可以有子类
               基本类型           包装类                       父类
                   int         java.lang.Integer             Number
                   long             Long                          Number
                   double        Double                        ...
                   short           Short        
                   float             Float
                   byte              Byte
                   char        Charcter                          Object
                   boolean         Boolean                  Object
(2)用法
             Number类及其主要方法:抽象类Number是Integer,Long,Double,Short,Float,Byte类的父类,Number类的子类必须提供将表示的数值转换成对应的类型的方法
             e.g. intValue()  以int的形式返回指定的数值

             Integer常用方法
             该类提供了int类型和String类型之间进行转换的方法,并且提供了一些常量
            static int MAX_VALUE  2^31 - 1的常量,表示int类型的最大值
            static int MIN_VALUE  -2^31

            Double常用方法
            构造方法
            Double(double value)
            Double(String s)
            常用方法
            double doubleValue() 返回此对象的double值
            static double parseDouble(String s) 返回一个新的double值,该值被初始化为指定的String表示的值
             Double.parseDouble("123.54")
             Double.parseDouble("¥123.54") 这么调用时会抛出NumberFormatException异常
      (3)自动装箱以及自动拆箱操作(autoboxing)
                该功能是从Java5.0之后加入的,自动装箱和拆箱是JDK5的编译器在编译器的“预处理”阶段进行的工作

                Integer a = 100;//装箱
                Integer b = 200;
                Integer c = a + b;//拆箱然后装箱

                装箱跟拆箱是编译器进行的工作,而不是JVM。编译器会在生成类的字节码时会插入必要的方法调用:Integer a = 100 =>Integer a = Integer.valueOf(100);
                注意:当包装类作为方法的参数时,eg:void takeNumber(Integer i){ },实际调用该方法时传递Integer类型或者int类型的参数都可以

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
想对作者说点什么? 我来说一句

java核心语法

2014年08月16日 7.88MB 下载

JAVA核心语法笔记

2009年05月07日 1.54MB 下载

核心语法

核心语法的具体内容

ny0205 ny0205

2017-05-25 17:48:51

阅读数:116

<em>Java核心</em>技术

2018年05月06日 0B 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭