Java_1.8_API
Java Application初步
- Java的源文件后缀是.java。类.class是源文件的基本组成部分
- 一个源文件中最多只能有一个public类,且其名字与文件名相同
- Java Application的执行入口是main()方法。其的书写方法是:public static void main(String args[]){...}
Java变量
按被声明的位置划分
- 局部变量:方法或语句块内部定义的变量(包括形参),局部变量在栈stack里分配内存。
- 成员变量:方法外部、类的内部定义的变量,非静态成员变量在堆heap里分配内存,静态成员变量在数据区data segment里分配内存。
- 注意:类外面(与类对应的大括号外面)不能有变量的声明
按所属的数据类型划分
- 基本数据类型变量
- 引用数据类型变量
- 变量若没有初始化,则默认为0,false,null
基本数据类型变量
- 布尔型boolean:只允许取true和false,不能用0和非0代替
- 整型byte,short,int,long(Java里没有无符号整型):整型常量默认为int;声明long型常量后必须加'l'或'L',否则会出错
- 浮点型float,double:浮点型常量默认为double;声明float型常量需加'f'或'F',否则会出错
引用数据类型变量
基础数据类型以外的所有类型都是引用数据类型
- 引用可以看成是C语言中的指针
- 引用指向的值全都放在堆内存里(即new出来的值都放在堆内存里),若声明了一个引用但没有new,则其值为null,即不指向任何值
数组
*数组不是基本类型,是引用类型,所以数组是存放在堆heap中的
- Java中声明数组的时候不能指定长度,如下
- s.length为数组s的长度
- 如果数组存放的是引用型数据,则需像下面这样使用
二维数组
==需要注意的是,java中的多维数组的内存并不是像c语言中的多维数组一样连续存放的,只有单一维度才是连续存放的。==
数组的复制
利用java.lang.System中的arraycopy可以实现数组的复制
变量类型的强制转换
例如要将一个字符型变量i强制转化为double型,则
运算符
- 逻辑运算符:!-逻辑非,&-逻辑与,|-逻辑或,^-逻辑异或(两者相同时为假),&&-短路与,||-短路或(与C语言的与或相同)
- 赋值运算符=:可以将整型常量赋值给byte,short,char等类型变量,只要不超出范围即可
- 字符串连接符+:'+'除了可以用来做算术加法,还可以对字符串进行连接操作。==PS:'+'运算符两侧操作数只要有一个是String类型,系统就会自动将另一个操作数转化为字符串然后进行连接。==
方法
格式:[修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表) { Java 语句; ... ... } 调用格式:对象名.方法名(实参列表) return语句结束方法的执行
方法的重载Overload
一个类中可以定义多个返回类型相同,名字相同,但参数个数或类型不相同的方法,例如:
调用Max类中的max方法时,编译器会通过判断max中的参数列来判断调用哪一个max方法。
方法的重写Overwrite/Override
- 在子类中可以根据需要对从基类继承来的方法进行重写。
- ==重写的方法必须与原方法具有相同的名称,返回类型,参数列表。== 十分容易在这里出错,所以每次重写时直接复制父类的方法声明。
- 重写的方法不能使用比原方法更严格的访问权限。
异常处理
==当异常出现时,程序会立刻停止当前的流程,根据异常的类型去执行相应的catch代码,然后直接跳去执行finally段代码。==
通常在finally语句中执行资源清楚工作,如:
- 关闭打开的文件
- 删除临时文件
- ······
Java中定义的异常类有如下分类:
- 其中Throwable类是所有异常类的基类,只要是继承它的类,就可以被抛出
- Error类为系统的内部错误,无法干涉,处理不了的错误
- Exception类是可以人为处理的异常,
- RuntimeException类是程序在运行时发生的异常,经常出现,这种异常,可以catch,也可以不catch,因为这类异常出现十分频繁
- 除RuntimeException、Error外的其他异常,必须catch
Java在处理异常的时候,调用printStackTrace方法可以将异常一层一层地打印出来(与python类似)
自定义异常
步骤:
- 通过继承Exception类声明该类为异常类,格式如下
- 在需要抛出自定义异常的时候,生成并抛出,如下
注意事项
- catch异常的时候,如果catch了Exception,那么这个catch后面的其他catch代码段就失效了,因为Exception是所有可以catch的Exception的基类,所以,catch的异常类越细越好。==即先抛小的,再抛大的。==
- 如果一个方法可能会抛出某种异常,但是你又不想在这个方法内部处理它,那么可以在声明时使用throws关键字,然后在调用该方法时再用try,catch来捕获异常,如下
java基础语法笔记
- 当一个方法抛出异常后,剩余下来的语句不会被执行
- 重写有抛出异常的方法时,必须抛出相同类型的异常或者不抛出
关键字
this 关键字
类似于Python中的self,this指向调用某方法的对象本身,即其值为当前对象的引用
补充:在一个类中,如果使用this(argument_list)则代表调用了该类中的某个构造方法,具体是哪个构造方法由参数列argument_list决定
static 关键字
- 在类中,用static声明的成员变量称为静态成员变量。
- 用static声明的方法为静态方法,在调用该方法时不会将对象的引用(this)传递给它,所以在静态方法中不能访问非静态成员。(类似于Python中的staticmethod)
- 可以通过对象.静态成员或者类名.静态成员来访问静态成员。
package 关键字
为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间
- 若想将一个类放入某个包中,在这个类的源文件的第一行写:
- 注意:
- 必须保证该类的.class文件放在正确的目录下即pkg1/pkg2/pkg3...
- 将该类的源文件.java移至其他目录下,否则该类的源文件可能会产生影响
- class文件的最上层包的父目录必须位于classpath下,即com上一级目录在classpath下
- 用cmd执行的时候也需要写全包名
打包jar包
在cmd里定位到想打包的包的com的上一级目录,然后输入命令
jar -cvf 名字.jar *.*
生成的jar包就和com在同一个目录下,此时再将.https://blog.csdn.net/weixin_/article/com/名字.jar 加入到classpath里就可以使用jar包里面的内容了
import 关键字
- 想访问某一个包内的类可以:
super 关键字
- 利用super.fatherMethod()可以引用基类中的方法
final 关键字
被final关键字修饰的变量、形参无法被改变,被修饰的方法无法被重写,被修饰的类无法被继承。类似于C语言中的const
类
常用类
String类
String类代表==不可变==的字符序列
- 因为String类不可变,所以对该类的对象进行操作的时候,效率会比较低
StringBuffer类
StringBuffer代表==可变==的字符序列
基础类型包装类
不同于基础类型的是,其包装类是存放在堆heap内存中的
Math类
该类提供了一系列静态方法用于科学计算,其方法的参数和返回值的类型一般为double
File类
代表系统文件名(路径或文件名),而不是文件 *File中的静态属性String separator存储了当前系统的分隔符,windows下是'',unix下是'/'。==然而不论是在windows还是UNIX,都写'/'就可以。==
枚举类型Enum类
类的继承Inherit与权限控制
- 通过继承,子类拥有了基类(superclass)或者说父类的所有成员(即成员变量和方法)
- Java只允许单继承不允许多继承
访问控制--Java权限修饰符
Java权限修饰符置于类的成员定义前,用来限制其他对象对该类成员的访问权限。
- private:private成员只能在类的内部访问。
- default:default成员可以在类的内部以及同一个包内访问。
- protected:protected成员可以在类的内部、同一个包内、子类内访问。
- public:public成员在任何地方都可以访问。
PS:class只可以用public和default修饰,并且,被default修饰的class只可以在同一个包内部的类访问
构造方法
类中有一个与类同名的方法,叫做构造方法(无返回类型),如:
上例中,Person类中的同名方法Person(int _id, int _age)称为构造方法,此方法是在new一个新的Person类是调用的,如:
上述过程定义Mike时调用了Person类中的构造方法
继承中的构造方法
- ==子类的构造过程中必须调用基类的构造方法。==
- 子类在其构造方法中使用super(argument_list)调用基类的构造方法(++调用哪个构造方法由argument_list决定++),并且必须写在子类构造方法的第一行。
- 也可以使用this(argument_list)调用本类其他构造方法。
- 如果子类中没有显式调用基类的构造方法,则默认调用基类中无参构造方法,若基类中没有无参构造方法,则编译出错。
object类
- object类是所有Java类的根基类
- 如果类的声明未使用extends声明其基类,则默认object类为其基类
- object类中有一个toString方法,该方法默认返回调用它的对象的类的名字,通常情况下要将toString方法重写,然后返回当前对象的有关信息。
- objcet类中的equals方法需要自己重新定义比较方式。字符串与字符串使用equals方法,默认判断两个字符串是否相同
对象转型casting
- 一个基类的引用类型可以指向其子类的对象,但这个引用不能访问子类中新增加的成员(属性和方法)
- 可以通过使用 a instanceof b 来判断a所指向的对象是否属于b类或者b的子类
- 子类的对象可以当作基类的对象来使用,称为向上转型upcasting,反之称为向下转型downcasting
多态Polymoph(也叫动态绑定、迟绑定)———面向对象的核心
动态绑定是指,在程序执行过程期间(非编译期间),判断所引用对象的实际类型,根据其实际类型调用对应的方法。
多态存在的必要条件
- 要有继承
- 要有重写
- 父类引用指向子类对象
满足以上条件后,当调用父类中被重写的方法时,会自动改为调用子类中对应的方法
抽象类
被abstract关键字修饰的类或方法叫做抽象类或抽象方法。
- 抽象类不能被实例化。(即这个类是不完整的,需要声明它的子类,并由子类来完善它自己)抽象类必须被继承。
- 抽象方法只需要声明,不需要实现。(即只需要声明有这样的一个方法就行,具体怎么实现,交给子类去重写)抽象方法必须被重写。
抽象类存在的意义:抽象类就像一个未完成的模型,它提供了该类所必须的某些成员与属性。
抽象方法存在的意义:这个方法是每个子类都会有的,但具体实现因类而异,所以它提供一个空的模板,想要怎么重写是子类的事。
接口 interface
接口可以看成是一中特殊的抽象类,它里面只有常量(即public static final修饰的变量)并且默认为常量,和抽象方法的定义(没有实现),并且这些方法必须用public修饰,例如:
- 一个接口可以继承另一个接口,并添加新的属性与方法,但不可以继承类
- 接口与实现类之间存在多态性,例如:
- 类使用implements关键字来实现接口,例如
容器API
容器API类图结构如下:
Collection接口
- Collection接口定义了存取一组对象的方法,其子接口Set,List分别定义了存储方式。
- Set中的数据对象没有顺序且不可以重复。
- List中的数据对象有顺序且可以重复。
注意,collection中只能存放对象
- 使用Collection接口的remove,contains等方法的时候,需要比较两个对象是否相等,这涉及到了equals和hashcode方法。对于自定义的类型,需要重写equals和hashcode方法来定义对象相等的规则。(相等的对象必须有相同的hashcode)
Set接口
Set接口实现了Collection接口,但是没有新增额外的方法,且实现Set接口的容器类中的元素是没有顺序且不重复的。
- Java中提供的Set容器类有HashSet,TreeSet等。
List接口
- 实现List接口的容器类中的元素是可重复且有序的。
- List容器中的每个元素都对应有一个整型序号记录该元素的位置,可以根据序号存取容器中的元素。
- Java中提供 的List容器类有ArrayList,LinkedList等。
Map接口
- Map接口定义了存储“键(key)——值(value)映射对”的方法。
- 实现Map接口的容器类有HashMap、TreeMap等。
- 键值是Map实现类的对象的标识,所以键值不能重复。
- Map中的key和value都只能是对象,不能是其他的。
Iterator接口
- 所有实现了Collection接口的容器类都有一个Iterator方法用以返回一个实现了Iterator接口的对象。
- Iterator对象称为遍历器,用以方便地实现对容器内元素的遍历操作。
- Iterator接口定义了如下方法
- boolean hasNext(); //判断游标右边是否有元素
- Object next();//返回游标右边的元素并将游标移动到下一个位置
- void remove();//删除游标左边的元素,在执行完next之后该操作只能执行一次(因为Iterator只能进行next操作而没有指向上一个元素的操作)
- Iterator对象的remove方法是迭代过程中删除元素唯一安全的方法
如何选择数据结构
Arrayd读快改慢、Linked改快读慢、Hash两者之间
对equals方法和hashcode方法的理解
- override后的equals方法应该通过比较两个对象中的内容来确定两个对象是否相等。
- override后的hashcode方法通过特定的计算方法来计算对象中的hashcode的值。
- 注意:如果hashcode的值会因对象属性的改变而改变,那么则需要十分小心。最好避免这种情况。
- 重写后的equals和hashcode方法应该遵守:如果两个对象equals,hashcode的值一定相等;如果两个对象的hashcode相等,它们不一定equals。
- 判断两个对象是否相等可以:先比较hashcode的值,如果不相等,那么两个对象一定不相等;如果相等,再调用equals方法,如果两个对象equals,那么这两个对象才相等。
Auto-boxing和unboxing
例子
机制
泛型Generic
注意:
- 泛型只在编译阶段有效,下面代码说明,泛型类型实际上还是原来对象所属的类型。
流Stream(输入与输出是从程序的角度来讲的)
输入流和输出流
Java所提供的所有流类型都位于java.io包内,且都分别继承以下4个抽象类。
InputStream
- 继承自InputStream的流都是用于向程序中输入数据的,单位为字节(8bit)。
- 基本方法
- int read() throws IOException;//读取一个字节并以整数(0-255)形式返回
- int read(byte[] buffer) throws IOException;//读取一系列字节存储于一个数组buffer,返回读取字节的个数
- int read(byte[] buffer, int offset, int length);//从offset开始读取length个字节
- void close() throws IOException//关闭流,释放资源
OutputStream
- 继承自OutputStream的流都是用于从程序中输出数据的,单位为字节。
- 基本方法
- void read()
- void read(byte[] buffer)
- void read(byte[] buffer, int offset, int length)
- void close()
- void flush();//将输出流中缓冲的数据全部写到目的地,用于close之前,防止数据还未写完,输出流就被close
Reader
- 以字符为基本单位的输入流。
- 基本方法与InputStream差不多,把byte[] buffer替换为char[] cbuf
Write
- 以字符为基本单位的输出流。
- 基本方法与OutputStream差不多,但是有多两个
- void write(String string);
- void write(String string, int offset, int length)//将字符串写入输出流
- void flush()
节点流和处理流
- 节点流可以从一个特定的数据源(节点)读写数据。如:文件,内存。
- 处理流连接在已存在的流(节点流、处理流)之上,能够进行数据的处理为程序提供更为强大的读写功能。
- 使用方法如下
转换流
- InputStreamReader和OutputStreamWriter用于字节数据到字符数据之间的转换
- InputStreamReader需要和InputStream“套接”,OutputStreamWriter同理
数据流
- 数据流属于处理流,需要套接在InputStream或OutputStream类型的节点流上,其提供了可以存取(以字节的方式)基本类型数据(如int、double等)的方法。即以字节的形式读进去,这样效率高且节约空间。
- 其构造方法为DataInputStream(InputStream in)
- ByteArrayInputStream和ByteArrayOutputStream
PrintStream和PrintWriter
- PrintStream属于输出流,可以将键盘的输入,输出到指定位置,比如:
Object流
- 用于直接将object写入或读出
- 如果先要将某个类直接写入或读出,则需实现接口Serializable,将其序列化为字节流
- 需要“套接”在OutputStream类对象上
transient关键字
- 被transient关键字修饰的成员变量,在被写入硬盘的时候默认是0或null、false。
GUI Graphics User Interface
Frame类
- 如果要创建窗口,最好自己定义一个窗口类,继承自Frame
Panel类
布局管理器接口LayoutManager
- 实现布局管理器接口的类有:FLowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout
FlowLayout
BorderLayout
- BorderLayout是Frame的默认布局管理器,它将整个容器划分成EAST,WEST,SOUTH,NORTH,CENTER五个区域,component只能被添加到这五个区域(默认添加到CENTER)
- 一个区域只能添加一个component,如果加入多个,原先的会被覆盖
- NORTH,SOUTH这两个区域只能在水平方向上缩放,WEST,EAST只能在垂直方向上缩放,CENTER可以在两个方向上缩放
GridLayout
注意
- Frame的缺省布局管理器的BorderLayout,Panel的是FlowLayout
- 当把Panel作为一个component添加到某个容器后,Panel仍然可以拥有自己的布局管理器
事件监听
- 事件源对象:发生某些事件的component
- 事件监听器:事件监听器是指实现了某种监听器接口的对象。当事件源对象发生某些事件的时候,会将*事件对象发送给监听器。
- 注册:使某个监听器对象能够监听某个事件源对象,这个行为叫做注册。
- 在事件监听器对象中,想要访问到事件源对象里面的属性,可以使用getSource方法。
TextField文本输入框
鼠标适配器
内部类
以上代码可以利用内部类的原理简化,即将MyMonitor类直接在MyFrame类里面声明,这样MyMonitor的成员就可以直接访问MyFrame类的成员变量。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/24717.html