Java基础

1、简单数据类型,采用值传递

2、引用数据类型(数组,对象),采用引用传递         

数据类型

数组:获取数组中某个值所在的index,Java中封装了对应的方法: int index = Arrays.binarySearch(arrays, key);

当数组作为一个参数传递的时候,采用的是引用传递,修改传递后的整个对象是无效的,但是修改对象中的某个具体的值的生效的,因为修改整个对象相当于把该引用指向别的地方,不会影响原来的数组,但是修改具体值的时候相当于进入指针内部,修改原对象的值。

 https://c.runoob.com/quiz/5571

binarySearch采用二分法封装

 

重载(静态多态,函数重名,解决不同数据类型编写多个不同函数名的情况)的条件:

1,参数个数不同

2,个数相同,类型不同

3,个数,类型相同,但在参数列表中出现的顺序不一样。                                                                                                                                                                                                                           

构造函数:

1,函数名称与类名相同。

2,不含返回类型。

定义了构造函数之后,在实例化对象时,就必须传入相应的参数列表。否则报错。类名 对象名=new 类名(传给构造函数的参数列表)         

3,在对象的生命周期,构造函数只会调用一次。

4,可以被重载(意思就是可以有多个)

5,系统会默认提供构造函数,系统默认提供的构造函数可以通过类 对象名=new 类名()来实例化。

静态

静态变量:

让各个对象共有的内容只用一个空间保存 static,在类被载入时创建,只要类存在,静态变量就存在,不管对象是否实例化。可以通过(对象名.变量名)或者(类名.变量名)来访问。      应用:保存跨对象信息;存储对象个数

静态函数:不能直接访问类中的非静态成员变量和成员函数,也不能使用this.关键字。

静态代码块:对所有对象的共同信息进行初始化,并对所有对象,只执行一次。static{执行语句}       

继承:Java不支持多重继承 ,一个子类只能有一个父类。  (extends)                     

子类继承父类之后,在实例化子类对象的时候,系统会首先实例化父类对象。若父类构造函数有参数,则实例化父类时,必须传入参数。(1,给父类增加一个不带参数的空构造函数;2,在子类构造函数中,第一句用super给父类构造函数传参数,注意传入的参数必须和父类构造函数中参数列表类型匹配)     

成员覆盖(重写override):     子类中成员函数的定义和父类相同,指名称相同,参数列表,返回类型都相同(若不同则报错)。(最后调用的是子类中)       注意:子类的访问权限不能比父类的更加严格。    若一定要在子类中调用父类的成员函数,用super.函数名

多态

(静态多态:函数重载,,动态多态:理论基础是父类引用可以指向子类对象)

1,函数传入的形参可以是父类类型,实际传入的可以是子类对象

2,函数的返回类型是父类类型,实际返回的可以是子类对象。

抽象类:抽象类不能被实例化;抽象类必须被重写,除非子类也是抽象类;抽象类也可以含有普通成员函数。

在使用抽象类时需要注意几点:

         1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

         2、抽象方法必须由子类来进行重写。

         3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

         4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

         5、子类中的抽象方法不能与父类的抽象方法同名。

         6、abstract不能与final并列修饰同一个类。

         7、abstract 不能与private、static、final或native并列修饰同一个方法。、

接口(interface):抽象类中所有的函数都是抽象的,就可以定义为接口;继承接口(实现接口)implement

接口中只能包含常量(public static void)和函数(public)         

接口可以通过extends继承另一个接口,类通过implements关键字来实现一个接口

一个类可以在继承一个父类的同时实现多个接口:class 子类 extends 父类 implement 接口1,接口2,接口3.....{}

final关键字:

1,修饰一个类:表示该类不能被继承

2,修饰一个函数:表示该函数不能被重写

3,修饰一个变量:表示该变量不允许被重新赋值。    、

单例模式:

一个对象只有第一次使用的时候实例化,适合一个类(单例类)只有一个实例的情况,提高系统性能, 模式要点:

1,某个类只能有一个实例

2,必须自行创建这个实例

3,必须自行向整个系统提供这个实例     

4,用静态变量来实现。

利用继承和多态扩充程序功能     

异常处理:Java规定,一个try后面必须至少接一个catch,可以不接finally,但是最多只能有一个finally       

                               

String

为字符串常量:string中封装的是不可变的字符串(

如执行str.replace('h','A');后h没有变成A

)如果要将其进行一些处理,就必须得到返回值             

String str1=str.replace('h','A');   

StringBuffer和StringBuilder:字符串变量 (其中的字符串值可以改变).       

执行速度:StringBuilder > StringBuffer > String   

StringBuilder是线程不安全的,而StringBuffer是线程安全的

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

集合:

1,集合中的元素个数是可变的

2,集合中可以存储不同类型的数据

一维集合:Conllection是一个接口(子系列:List,Queue,set)  而Conllections是一个类

二维集合:map

ArrayList:随机访问,不必在除尾部的任何位置插入或除去元素;

LinkedList:频繁的从集合的中间位置添加和除去元素;

Vector:线程安全;       

二维集合:HashMap(put,get方法) 非线程同步

1,保证遍历时按照添加进去的顺序(将HashMap改为LinkedHashMap) 

2,将HashMap里面的元素按照key值排序(将HashMap改为TreeMap,默认升序,降序TreeMap(comparator c)) 

Hashtable线程同步。

队列:

Java中Queue的一些常用方法:
add         增加一个元素                      如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove   删除并返回队列头部的元素     如果队列为空,则抛出一个NoSuchElementException异常
element  查询返回队列头部的元素              如果队列为空,则抛出一个NoSuchElementException异常
offer       添加一个元素并返回true        如果队列已满,则返回false
poll         移除并返问队列头部的元素     如果队列为空,则返回null
peek       返回队列头部的元素              如果队列为空,则返回null
put         添加一个元素                       如果队列满,则阻塞
take        移除并返回队列头部的元素    

日期操作:

java.util.Date

java.util.Calendar()

年:Calendar.YEAR     获取方式:obj.get(Calendar.YEAR)

月:Calendar.MONTH

日:Calendar.DAY_OF_MONTH;

周:Calendar.DAY_OF_WEEK;

小时:Calendar.HOUR

分钟:Calendar.MINNUTE

秒钟:Calendar.SECOND

java.util.TimeZone

格式化日期:SimpleDateFormat(String pattern如“yyyy年MM月dd日 hh:mm:ss”);

格式化数值:使用NumberFoemat的子类DecimalFormat(String pattern)

 

多线程:

1,进程与线程的区别:进程包含线程;线程可以并发,线程不可以;进程拥有自己的变量,而线程共享一个进程内的这些数据。进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,

实现多线程的方式:

继承Thread实现多线程;1,编写一个类,继承java.util.Thread类;2,重写该类的run()方法,将线程需要执行的代码放进run函数;3,实例化线程对象,调用其start()函数来启动该线程。

实现Runnable接口开发多线程;1,编写一个类,继承java.util.Runnable接口,继承接口用的关键字是implements;

2,重写该类的run()方法,将线程需要执行的代码放进run函数;3,实例化2中编写的Runnable实现类,将后者传入Thread对象的构造函数,调用其start()函数来启动该线程。

如何控制线程的运行:利用Thread.sleep()结合run方法中有一个while循环,将该循环的执行标志由true改为false即可

线程协作:避免抢占CPU导致结果不正确:调用线程ct的join方法,可以让系统等该线程(ct)运行完毕再运行接下来的代码。

例:ct.start();ct.join();st.start();

线程同步:解决方式:synchronized关键字解决synchronized(同步锁对象:必须是可以被各个线程共享的,如this,全局标量,不能是一个局部变量){//访问共享资源,需要同步的代码段}

原理:当某一线程运行同步代码段时,在同步锁对象上置一标记,运行完这段代码,标记消除,若其他cpu想要抢占,必须先检查该标记是否已经消除。

死锁:两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象

产生条件:

互斥条件,请求与保持,不剥夺条件,循环等待

解决死锁的办法:

可以撤销陷于死锁的全部进程;可以逐个撤销陷于死锁的进程,直到死锁不存在;从陷于死锁的线程中逐个强迫放弃所占用的资源,直至死锁消失。

定时器:

定时器所做的具体工作类:java.util.TimerTask

定时器活动控制类:java.util.Timer

Java IO

File类:在路径中,windows系统规定的分隔符是“\”如果写成常量,应该用“\\”表示。在unix系统中,分隔符是"/"

字节流的输入输出:

写文件:(字节)FileOutputStream fos=new FileOutputStream("C:\\test.txt");//创建文档所在目录及文件名

字符:PrintStream()

String msg="123e3cda";//文件中需要写入的内容

写入:write(msg.getBytes());

关闭:close()

读文件:FileInputStream

File file=new File("C:/new.txt");

FileInputStream fis=new FileInputStream(file)

byte[] data=new byte[(int)file.length()]

读:fis.read(data);

关闭:fis.close();

String msg=new String(new String(data));

System.out.println(msg);

 

Java中将字符串改为字符数组:char chs[]=msg.toCharArray();

读写对象:ObjestOutputStream和ObjectInputStream

如果一个对象需要被输入输出,该对象对应的类必须实现java.io.Serializable接口。

字符流的输入输出:读写文件:

写文件:FileWriter(string路径,不存在则创建,存在,删除后再创建,|boolean(true,表示在原文件末尾添加新内容)|)

读文件:FileReader调用该类中的函数进行文件操作。

逐行读文件中的数据:BufferedReader.readLine();

键盘行输入:BufferReader

用RandomAccessFile类进行文件读写。(适合文本数据很大)

RandomAccessFile raf=new RandomAccessFile("目录","rw/r");//rw代表写(结合write);r代表读(结合read)

seek函数设置文件读取和写入的位置。

Properties 涉及XML格式。、

Java GUI 

主要包swing

控件(组件):标签(JLabel),按钮(JButton),文本框(JTextFiled),多行文本框(JTextArea),密码框(JPasswordFiled),单选按钮(JRadioButton),复选框(JCheckBox),下拉列表框(JComboBox),

菜单(JMenuBar,JMenu,JMenuItem),

JOptionPane[消息框showMessageDialog);输入框(showInputDialog);确认框(showConfirmDialog)];

 

大数值Math.BigDecimal

初始化:BigDecimal a=new BigDecimal(str);]

加减乘除运算:

a+b:a.add(b)

a-b:a.subtract(b)

a*b:a.multiply(b)

a/b:a.divide(b,scale)     scale为确定的精度位数(小数位数)。

a.stripTrailingZeros().toPlainString()    去除无用的0,并转为string(注意这里不是用toString(),而是用toPlainString());

 

 

 

 

                                                                                                                                                                                                                                                                                                                                                  

你可能感兴趣的:(Java)