Java 基础知识总结

 

1.数据类型:

 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (byte)0,short  16位 (short)0,int  32位  0,long  64位  0L)                                                          

                                                  2}.浮点类型(float 32位 0.0f,double 64位 0.0d)                                                          

              2).字符型(char  2位 \u0000(空,''))                                                

                                   3).布尔型(boolean false)

              2>.引用数据类型:1).类(class)                           

                                     2).接口(interface)

                                     3).数组

转义字符:  \f  换页      \\  反斜线     \b 倒退一格    \' 单引号     \r 归为     \" 双引号     \t 制表符Tab                \n 换行

转换类型: 转换前的数据类型与转换后的类型兼容, 转换后的数据类型的表示范围比转换前的类型大:自动转换, 强制转换 : (欲强制转换的数据类型) 变量名称;

中断语句: break 跳出当层的循环      continue 中止本次循环      return  终止方法

2.数组:

一维数组:存放数据类型相同的数据   

  1. 数据类型数据名[]=null;    栈内存里存放
  2. 数据名=new 数据类型[长度]  分配内存,开辟长度空间,堆内存存放
  3. 数据类型[] 数据名=null
  4. 数组名.length   求数组的长度

二维数组

  1. 动态初始化:(1) 数据类型数据名[][];  第一个[]是行,第二个[]是列,(2) 数据名[][]=new 数据类型[行的个数][列的个数]
  2. 静态初始化: 数据类型数据名[][]={{第0行初始值},{第1行初始值},{第0行初始值},…{第n行初始值}}

多维数组:  数组类型 数组名[][][],,,;

foreach输出:

for(数据类型 变量名称:数组名称){
      System.out.println(变量名称+”,”);
}

3.方法与方法的重载:

方法的重载:方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用,返回值类型不同不能算重载

     

            调用属性 :  对象.属性名称;

            调用方法 :  对象.方法名称();

构造方法

  • 只要一有实例化则就会调用构造方法
  • 构造方法的名称必须与类名称一致
  • 构造方法的声明处不能有任何返回值类型的声明
  • 不能在构造方法中使用return返回一个值
  • 如果一个类中没有明确的声明一个构造方法,则会自动生成一个无参的什么都不做的构造方法.
  • 匿名对象:没有名字,在java中如果一个对象只使用一次,则就可以将其定义成匿名对象.比之前的对象少了一个栈内存的引用关系.
  • 构造方法的私有化:减少实例化对象,在类内部产生对象,这是单太设计模式,所谓的单太就是在入口处(构造方法)限制了对象的实例化操作.

代码块

  • 普通代码块:直接定义在方法中的代码块称为普通代码块
  • 构造块: 直接在类中编写代码块,称为构造块
  • 静态代码块
    • 使用static关键字声明的代码块称为静态代码块
    • 静态快优先于主方法执行
    • 如果在普通类中定义的静态快,优先于构造块执行,
    • 不管有多少个实例化对象产生,静态代码块只执行一次
    • 静态代码块的主要功能就是为静态属性初始化
  • 同步代码块:synchronized

static:

  • 使用static声明属性,表示全局变量
  • java内存区域
    1. 栈内存:可以保持对象的名称(保存,访问的堆内存的地址)
    2. 堆内存:保存每个对象的具体属性
    3. 全局数据区:保存static类型的属性
    4. 全局代码区:保存所有方法的属性
  • 使用static声明方法: 此方法可以使用类名称进行调用,使用的static方法不能调用非static的属性或反法

final:

  • final在java中表示的意思是最终的意思,也可以称为完结器
  • 使用final声明的类不能有子类;
  • 使用final声明的方法不能被子类所覆写;
  • 使用final声明的变量即成为了常量,常量不可以修改.
  • 使用 static final联合声明的变量为全局常量.

instanceof:

  • 使用instanceof关键字判断一个对象到底是哪个类的实例
  • 格式: 对象1  instanceof 对象2;  返回的值是个boolean型的;

Object:

  • Object是所有的类的父类
  • public int hashCode();取得Hash码
  • public String toString(); 对象打印时调用

String:字符串的内容不容易改变

String. valueOf(int i);将数字转换成字符串
String.substring(int 开始点, int结束点),  按位截取字符串
String. toCharArray(); 将字符串变成一个字符数组
String. trim();  清除字符串两边的空格
String.indexOf(String str); 返回一个整数,表示这个字符串在String中的位置
String.indexOf(String str , int  开始查找的位置); 从某一位置开始查找
String. charAt(int index);取出字符串中的一个字符
String. split(String regex);按regex字符串截取String字符串  返回一个字符串数组
String.split(String regex, int limit);limit是截取多少次
String. toUpperCase();将字符串变成大写
String. toLowerCase();将字符串变成小写
String. startsWith(String prefix);判断字符串是否以指定的字符串开始的
String. endsWith(String suffix);判断字符串是否以指定的字符串结尾
String.equals (Object anObject);判断两个字符串是否相等
String.equalsIgnoreCase(String anotherString);不区分大小写判断两个字符串是否相等
String.replace(char oldChar, char newChar);替换字符串;

System:

public static long currentTimeMillis() 返回以毫秒为单位的当前时间
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 数组拷贝操作
public static Properties getProperties() 取得当前的系统全部属性(如:System.getProperties().list(System.out);)
public static String getProperty(String key) 根据键值取得属性的具体内容(如:System.out.println(“系统用户:”+System.getProperty(“user.name”));)
protected void finalize() throws Throwable{}  在对象被回收之前进行调用,以处理对象回收前的若干操作,例如释放资源等等.
System.exit(int status);如果status为非0就直接退出程序.
System.gc().运行垃圾回收机制,调用的是Runtime类中的gc方法
System.out.println();向显示屏上输出.
System.errprintln();输出错误信息
System.in;从键盘接受的输入流,是字节流;

5.异常:

  • 格式:

        tyr{ //有可能出现异常的语句 }catch(异常类 异常对象){ //编写异常的处理语句 }finally{ //一定会运行到的程序代码; }

  • 在整个java的异常结构中,实际上有以下两个最常见的类:Exception ,Error,这两个类全都是Throwable的子类
  • Exception:一般表示的是程序中出现的问题,可以直接使用try…catch处理
  • Error:一般指的是JVM错误,程序中无法处理
  • throws关键字:使用throws声明的方法表示此方法不处理异常,而是交给反法的调用处进行处理
  • 格式:

        public 返回值类型 方法名称(参数列表…)throws异常类(如:Exception){}

  • throw关键字:作用是在程序汇总抛出一个异常,抛出的时候抛出的是一个异常类的实例化对象.
  • 断言(assert):就是肯定某一个结果的返回值是正确的,如果最终此结果返回值是错误的,则可以通过断言检查肯定会为用户提示错误信息.
  • 格式:
      •  
      • 同步:就是指多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行.要想解决资源共享的同步操作问题,可以使用同步代码块及同步方法两种方式完成

        同步代码块:

        1. 使用synchronized关键字声明的代码块,称为同步代码块
        2. 定义格式:  synchronized (同步对象){ 需要同步的代码; }   对象一般是当前对象,使用this表示当前对象
        3. 同步代码块没有异步的效率快

        同步方法:  和同步代码块运行效果一样;格式: synchronized 方法返回值 方法名称(参数列表){需要同步的代码块;}

        死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们都将无法推进下去,程序中过多的同步会产生死锁

        等待与唤醒:Object类对线程的支持

        public final void wait() throws InterruptedException 线程等待
        public final void wait(long timeout) throws InterruptedException 线程等待,并指定等待的最长时间,以毫秒为单位
        public final void wait(long timeout,int nanos) throws InterruptedException 线程等待,并指定等待的最长毫秒及纳秒
        public final void notity() 唤醒第一个等待的线程
        public final void notityAll() 唤醒全部等待的线程,谁的优先级高先唤醒谁

        标志位:设置标志位解决生产者消费者重复取的问题;

        8.泛型 Generic:

        泛型:可以解决数据类型的安全性问题,它主要的原理,是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型,这样在类声明或实例化的时候只要指定好需要的类型即可.

        泛型类的定义格式:

        [访问权限] class 类名称 <泛型类型1, 泛型类型2,…>{
                     [访问权限]泛型类型标识 变量名称;
                     [访问权限]泛型类型标识 方法名称(){};
                     [访问权限]返回值类型声明 方法名称(泛型类型标识 变量名称){};
        }

        泛型对象定义:

        类名称<具体类> 对象名称=new 类名称<具体类>();

        构造方法中使用泛型:  构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造设置属性内容的时候,那么构造方法的定义与之前并五不同,不需要像声明类那样指定泛型.

        •  格式: [访问权限]构造方法([<泛型类型> 参数名称]){}

        9.通配符“?”:

         受限泛型:在引用传递中泛型操作中也可以设置一个泛型对象的范围上限和范围下限.范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object类

        设置上限:

        1. 声明对象:类名称< ? extends 类> 对象名称
        2. 定义类:[访问权限] 类名称<泛型标识 extends 类>{}

        设置下限:

        1. 声明对象:类名称<? super 类>对象名称
        2. 定义类:[访问权限] 类名称<泛型标识 extends 类>{}

        泛型与子类继承的限制:一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接收的.

        泛型接口:声明泛型类的语法类似,也是在接口名称后面加上<T>

        [访问权限]interface 接口名称<泛型标识>{}

        定义泛型方法:泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型,使用如下的格式定义泛型方法:

         [访问权限]<泛型标识> 泛型标识 方法名称([泛型标识 参数名称])

        泛型数组:使用泛型方法的时候,也可以传递或返回一个泛型数组

        10.定时调度:

         定时调度:每当一端时间,程序会自动执行,称为定时调度.必须保证程序始终运行着才可以,也就是说是想当于定时调度是在程序之外又启动了一个新的线程.

        Timer:是一种线程设施,可以用来实现在某一个时间或某一端时间后,安排某一个任务执行一次,或定期重复执行.该功能要与TimerTask配合使用,TimerTask类用来实现由Timer安排的一次或重复执行的某一个任务.每个Timer对象对应的是一个线程,因为次计时器所执行的任务应该迅速完成,否则可能会延迟后续任务的执行,而这些后续的任务就有可能堆在一起,等到该任务完成后才能快速连续执行.

        常用方法

        public Timer()  用来创建一个计时器并启动该计时器
        public void cancel() 用来终止该计时器,并放弃所有已安排的任务.对当前正在执行的任务没有影响
        public int purge() 将所有已经取消的任务移除,一般用来释放内存空间
        public void schedule(TimerTask task,Date time) 安排一个任务在指定的时间执行,如果已经超过该时间,则立即执行.
        public void schedule(TimerTask task,Date firstTime,long period) 安排一个任务在指定的时间执行,之后以固定的频率(单位:毫秒)重复执行.
        public void schedule(TimerTask task,long delay) 安排一个任务在一端时间(单位:毫秒) 后执行.
        public void schedule(TimerTask task,long delay,long period) 安排一个任务在一段时间(单位:毫秒)后执行,之后以固定的频率(单位:毫秒)重复执行
        public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 安排一个任务在指定的时间执行,之后以近似固定的频率(单位:毫秒)重复执行
        public void scheduleAtFixedRate(TimerTask task,long delay,long period) 安排一个任务在一段时间(单位:毫秒)后执行,之后以近似固定的频率(单位:毫秒)重复执行.

        schedule()与scheduleAtFixedRate()方法的区别: 两者的区别在与重复执行任务时,对于时间间隔出现延迟的情况处理:

          • schedule() 方法的执行时间间隔永远是固定的,如果之前出现了延迟的情况,之后也会继续按照设定好的时间间隔时间来执行
          • scheduleAtFixedRate()方法可以根据出现的延迟时间自动调整下一次间隔的执行时间.

        TimerTask:要想执行具体的任务,则必须使用TimerTask类. TimerTask类是一个抽象类.如果要使用该类,需要自己建立一个类来继承此类,并实现其中的抽象方法.

        1) public void cancel() 用来终止此任务,如果该任务只执行一次且还没有执行,则永远不会再执行,如果为重复执行任务,则之后不会再执行(如果任务正在执行,则执行完成不会再执行).

        2) public void run() 该任务所要执行的具体操作,该方法为引入的接口Runnable中的方法,子类需要覆写此方法.

        3) public long scheduleExecutionTime() 返回最近一次要执行该任务的时间(如果正在执行,则返回此任务的执行安排时间),一般在run()方法中调用,用来判断当前是否有足够的时间来执行完成该任务.

        简单示例:

        import java.util.TimerTask ;
        import java.util.Date ;
        import java.text.SimpleDateFormat ;
        class MyTask extends TimerTask{ // 任务调度类都要继承TimerTask
             public void run(){
                 SimpleDateFormat sdf = null ;
                 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
                 System.out.println("当前系统时间为:" + sdf.format(new Date())) ;
             }
        };
        import java.util.Timer ;
        public class TestTask{
            public static void main(String args[]){
                Timer t = new Timer() ; // 建立Timer类对象
                MyTask mytask = new MyTask() ; // 定义任务
                t.schedule(mytask,1000,2000) ; // 设置任务的执行,1秒后开始,每2秒重复
            }
        };

         

         篇幅太长,分为下节:

        Java 基础知识总结 2