java基础自学笔记
前言
很久之前曾经学了一段时间java,今天偶然翻出了当时的笔记,想着留个纪念。
因为当时进行的是基础学习,并没有什么难点,所以这个笔记并不十分全面,也不够详尽(例如泛型、向量、数据流等等都没有,但这些东西想要初步掌握并不困难,所以本文也不再增加),但对一些初学者来说应该仍然有一定的价值。
一. java的一些基本规则
- java的常量使用final关键字修饰。
- java的逻辑判断有布尔值true和flase,与c与c++的0和1不同,不能与别的数据运算,例:9>3>2是不合法的,因为9>3的值是true,则原式变为true>2,无法比较。但9>3+2是合法的,最后结果为true,因为关系运算符的优先级比算术运算符低。
- For-each循环:for(int k:a) { 。。。};//a是数组名;主要作用是遍历数组,并且不能修改内容,有时非常方便
- Java可以在类中定义变量时赋值,不赋值的话会有默认值,整形的默认值是0
- Java定义类中数据成员与方法的时候,默认为default类型(同一包内自由访问)
- 一个编译单元(一个java源文件)只能有一个public类型的类,且类名必须和文件名相同。
- Break可以带标号,指定作用域
二.java的面向对象基础
-
Java有包裹类型,其中基本数据类型的:
byte—Byte
short—Short
long—Long
int—Integer
float—Float
double—Double
char—Character
boolean—Boolean -
Java的字符串类型的对象本质是一块内存空间的管理者,若有a和b两个字符串类型对象,a=b意味着a和b指向同一块空间,管理同一块内存,自然值也是一样的。
-
字符串类型的比较比较的是是否指向同一块空间,所以a==“abc”这样的判断是不对的,如果要比较内容是否相同,可以使用equals,例:a.equals(“abc”),或a.equals(b);
-
字符串的几种操作:
比较内容大小:a.compareTo(b)
获得长度:a.length()
访问:a.charAt(1)//a=“abc”,则输出b。但是这个操作不能和for-each循环一起使用。 -
容器
ArrayList容器允许相同的值(因为List是列表),导入为import java.util.ArrayList;
HashSet容器不允许有相同的值(因为set是集合)。
HashMap: HashMap<Integer,String>xxx=new……….();(integer是包裹类型),integer是key,string是值。Key和值不一定是integer和string类型。Key是惟一的,如果两个值的key相同,那么后一个值会覆盖前一个。 -
继承
修饰符为extends(扩展)。
Protected: 自身和子类以及同一个包中的其他类可以使用。
Super(xxx): 直接调用父类构造函数
Super.xxx(): 调用父类方法
Suoer.xxx: 从子类中获取父类的xxx数据值。 -
其他
Java不能做对象之间的赋值,只能做管理权的变动
子类对象可以给父类对象赋值,反之不可。除非用一个被子类对象赋值的父类变量(此时这个变量类型是父类,但是其中实际管理的是子类对象)给子类对象赋值。
例: 子类 xxx=(子类) 父类对象(父类须被子类赋值过)。
即上转型对象。
三.抽象、接口、异常基础
- 抽象类中没有定义只有声明,因为抽象只是表达一种概念而不去具体实现它,且抽象类无法有具体的对象
- Java的抽象关键字是abstact,例:public abstact class A{。。。}
- 在java中,显而易见,如果一个子类继承自一个抽象类,那么必须把抽象类中的所有抽象函数全部覆盖,否则他自己也会变成抽象类,从而导致无法创建对象。
- 接口是纯抽象类,即:1.所有的成员函数全部是抽象函数;2.所有的成员变量全部是public static final(公有静态常量)类型。
一. 对于一维数组,使用length是获得元素个数;对于二维数组,使用length是获得一维数组的个数。
二. 使用final修饰的方法不可以被重写,使用fianl修饰的类不可以被继承,因为内存空间不能变更,例:final class xxx{。。。};
接口
- 声明关键字:interface。接口中不能有变量,只有常量;而方法只有声明,没有实现,是抽象的,例:
interface X{ final int a=1; int xxx();}; - 其中,方法默认为public abstract的
- 接口可以互相继承,使用extends;接口也可以多继承。
- 类可以实现接口,关键字为implements,类一旦实现接口,必须实现他们的所有方法,并用public修饰。
- 接口定义的常量被所有实现它的类所共享。
- 接口本质就是为了弥补java只能单继承这个“缺陷”
匿名类
- 子类对象的创建和类体定义同时进行的类,称为匿名类
- 匿名类不能声明对象,但是可以创建对象。例:New A{。。。};就是一个匿名类,其中A是一个具体的类,也是匿名类的父类
- 匿名类必须是内部类,可以重写(因为是子类)。
- 作用:例:有一个方法为f(A a),参数是一个A的对象,则可以f(New A{。。。});
另外:接口回调和上转对象和匿名传参等等,其实就是多态的体现,方法大同小异,都是用用子类对象赋值给父类对象,达到重写的目的。
异常
- java中的异常属于一种类
- Throwable是所有异常类的父类,只有他和他的子类的对象才能被异常机制处理,所以自己写异常必须要继承它或它的子类。
- 结构有两种:try-catch-finally和throws
- 第一种:try{。。。}catch(异常类名 对象名){。。。}catch(同上){。。。}finally{。。。}
- Finally可以没有,有的话必须在所有catch块后面,且不论有无异常都会执行。
- 第二种结构是throws-throw。Throws加在方法声明后,throw则是和c++一样,抛出异常。
四.java的gui基础
一、 图形界面
三要素:放置组件的容器(窗体、对话框、中间容器);在容器中的控件(按钮、文本框、菜单等);事件监听机制(监听器和事件处理)。
二、 主要包
- java.awt(布局类)(重组件)
- java.awt.event(事件监听)
- javax.swing(窗体组件)(轻组件)
- java.awt和javax.swing都有控件,但是java.awt消耗的资源多而且兼容性差。
三、 窗体类
- JFrame(重)
- 当需要一个窗体时,可以使用它或者它的子类来创建一个对象(即窗体)。用它创建的窗体默认添加到显示器上,所以不能把此窗体加到其他的容器中。
- 创建时的参数为字符串,也就是标题,也可以不写。
方法
- setLocation(int,int)-窗口左上角位置;
- setSize(int,int)-窗口高和宽;
- setBounds(int,int,int,int)-1和2的综合体;4.setVisible(boolean )-true窗体可见,默认false;
- setResizonble(boolean )-设置是否可调整窗体大小,默认不能。
- setDefaultCloseOpreation(int xxx)-单机“X”号后发生的事。(xxx是int类型静态常量可以用类名直接调用,例如EXIT_ON_CLOSE),
例:setDefaultCloseOpreation(JFrame.EXIT_ON_CLOSE)-单击后结束整个程序
四、 布局管理器
- 更改布局需要使用setLayout()方法。
- FlowLayout类(流线型布局)、BordLayout(默认布局,东西南北中)、GridLayout(规则的网格状布局)、盒式布局
- FlowLayout按照添加的先后顺序左到右依次排列,组件大小不随窗口位置大小的改变而改变,但是位置改变。
- FlowLayout参数:(对齐方式,横向间隔,纵向间隔),对齐方式有:LEFT(左对齐)、RIGHT(右对齐)、CENTER(居中对齐)–需要用类名调用,静态常量。
方法
setHgap(int )-设置横向间隔
setVgap(int )-设置纵向间隔
setAlignment(int )-设置对齐方式
BordLayout类
- 中间区域最大。添加组件方式:add(组件,位置)
- 位置还是静态常量,需要类名调用:NORTH(北)、SOUTH(南)、EAST(东)、WEST(西)、CENTER(中)。
- 同一位置的组件具有覆盖效果。
GridLayout类
- 构造:GridLayout(int,int,int,int)-x行x列,每一行列x高x宽。
盒式布局
- 用Box类,例:Box box1;其中存放的是容器,有两种容器布局:
box1=Box.creatHorizontalBox();-行型盒式布局,有水平支撑方法(上沿对齐)。
box1=Box.creatVerticalBox();–列型盒式布局,有垂直支撑(左沿对齐) - 水平支撑方法:creatHorizontalStrut(宽度);
- 垂直支撑方法:creatVerticalStrut(高度);
- 中间容器
JPanel类,默认布局是FlowLayout
JScrollPane,创造滚动条
JSplitPane—拆分窗格。
五、 文本框
- JtextField文本框;JpasswordField密码框;JtextArea(文本区,可写入多行字符)
- JTextField(int x)-可输入x个字符。
- Jtextfield(string s)-初始内容为s串
- SetText()、getText()
- SetEditable(boolean)–设置可编辑性,默认可。
- SetEchoChar(char c)–密码框,设置回显字符,默认“*”
- JTextArea(int,int)–可容纳x行y列。
六、 事件机制
- 事件源、监听器、处理接口
- 事件源调用方法为自己添加监听器,例:addActionListener();
处理方法:public void actionPerformed(ActionListener a) - 事件机制是使用的接口,实现了某个抽象方法。
七、 标签与按钮组件
- JButton(string)、JButton(Icon icon)-icon是图标,这个没用过。JButton(string,ICON)–以上综合版。
- 方法:setText()、getText()、getIcon()、setIcon()。
- 方法:setMnemonic(char m)–设置键盘激活,m是‘a’~‘z’,使用alt+m就能激活。
- 标签:JLabel(string)、JLabel(Icon)–默认左对齐。
八、 复选与单选框
- 复选框JcheckBox类用来进行多选择,单选JRadioButton就单选,显而易见的。
- JcheckBox(string,Icon),同样可以拆分。
- 方法:boolean isSelected()–返回他是否被选中。
- 监听器:addItemListener(ItemListener listener)
- 处理事件方法:public void itemStateChange(ItemEvent ie)
- 单选按钮可以被划归为某一组,某一组内同一时刻只能有一个被选中。
- 归组:ButtonGrop类,设bg为此类对象,则bg.button(单选按钮名)。
五.java的线程基础
一、 线程基础
- 进程是一次动态执行过程,同一段程序可以作为执行蓝本被多次加载到不同内存区域运行,从而形成不同进程。
- 线程是比进程更小的单位,可以是进程的一部分,一个进程可以有多个线程,形成多个执行流。
- 线程类为Thread类
- 线程生命周期:产生、存在(中断,休眠)、消亡。
- 可以通过继承Thread类或实现Runnable来创建线程对象。
- 创建线程对象后,必须调用start()方法来获取使用cpu资源的排队机会。
- 消亡:任务完成或者被强制终止。
- Run()方法里是线程的操作。
二、 线程中断
- JVM将cou使用权切换给了其他线程。
- 执行了sleep()方法,进入了休眠状态。
- 执行了wait()方法,是用notify()或notifyAll()结束。
- 执行了阻塞操作(比如需要通过键盘输入数据)
三、 创建线程
- Thread构造方法:Thread()或Thread(Runnable b);b是一个接口对象,所以b必须是一个实现了此接口的对象。
- 通过继承Thread类,重写public void run()方法来创建。
- 通过实现Runnable接口的run()方法创建。
四、 线程的常用方法
- sleep(毫秒)
- isAlive(boolean ),被final修饰,不能重写,返回boolean值,判断线程是否处于运行状态。
- interrupt()结束休眠
- currentThread()返回一个Thread对象,即正在使用cpu资源的线程对象;使用类名直接调用。
- setName()和getNName()
五、 线程同步
- 当多个线程要处理同一组数据时,可能会出错。
- 关键字:ssynchrized
- 使用关键字修饰某方法后,某线程调用此方法时,就必须执行完此方法内的所有任务。例:public synchrized void xxx(){。。。}
- 如果某线程的同步方法需要一个变量,但是此变量需要另一个线程来修改后才能用,那么可以在同步方法中使用wait()方法来让出cpu的使用权。等另一个线程完毕后,可以使用notify()或者notifyAll()来结束等待状态,进入排队状态。
六、 线程联合
- 一个线程运行时,可以通过join()方法来联合
- 比如Thread1在运行,这时,thread2.join();则称thread1在运行期间联合了thread2
- 若thread1联合了thread2,则thread1中断,thread2获得使用权,并且在thread2任务全部完成后(消亡),thread1才结束中断状态。进入排队状态。
- 若thread2已经消亡,则thread2.join()不起任何作用。
七、 守护线程 - 使用setDaemon(boolean )方法将自己设置为守护线程或者不是守护线程。
- 当守护线程内的所有普通线程都结束后,守护线程的run()里即使还有没执行的语句,也会被强制结束。例:java的垃圾回收机制。
- 用法:创建多个线程,然后设置一个为守护线程,其他的自动成为被守护线程。
- 注意:必须在这个线程的start()方法前设置为守护线程。