毕向东Java学习笔记.docx
- 文档编号:7811815
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:36
- 大小:683.43KB
毕向东Java学习笔记.docx
《毕向东Java学习笔记.docx》由会员分享,可在线阅读,更多相关《毕向东Java学习笔记.docx(36页珍藏版)》请在冰豆网上搜索。
毕向东Java学习笔记
Java基础学习笔记
1.JRE和JDK
JRE(JavaRuntimeEnvironment):
Java运行环境,包括Java虚拟机和Java所需的核心类库等。
JDK(JavaDevelopmentKit):
Java开发工具包,供开发人员使用,JDK中包括了JRE。
其中的开发工具包括:
编译工具(javac.exe)、打包工具(jar.exe等)
2.静态(static)
用法:
修饰符用来修饰成员(成员变量、成员函数)
static修饰内容被对象所共享。
被static修饰的成员可以直接被类名调用(类名.静态成员)
特有数据随对象存储
static特点:
1.随着本类的加载而加载,随着类的消失而消失。
2.优先于对象存在(静态先存在,对象后存在)。
3.被所有对象所共享。
4.可以直接被类名所调用。
实例变量和类变量区别:
1.存放位置:
类变量随类的加载存在于方法区中。
实例变量随对象的建立而存在于堆内存中。
2.生命周期:
类变量生命周期长随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1.静态方法只能访问静态成员,非静态方法既可以访问静态也可以访问非静态。
2.静态方法中不可以定义thissuper关键字,因为静态优先于对象存在所以静态方法中不可以出现this。
3.主函数是静态的。
静态的利弊:
利:
对对象的共享数据进行单独空间的存储节省空间;可以直接被类名调用;
弊:
生命周期过长;访问出现局限性。
什么时候使用静态?
1.当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据那么该功能可以定义成静态的)
每一个应用程序中都有共性的功能可以将这些功能进行抽取独立封装以便复用。
将方法都静态后可以方便使用但该类还可以被其他程序建立对象为了严谨强制让该类不能建立对象可以通过将构造器函数私有化完成。
静态代码块:
static{ 静态代码块中执行的语句} 特点:
随着类的加载而执行用于给类进行初始化。
3.抽象类
当多个类中出现功能相同,但是功能体不同,可以进行向上抽取,这时,只抽取功能定义,不抽取功能主体。
抽象的特点:
1.抽象方法一定在抽象类中。
2.抽象方法和抽象类都必须被abstract关键字修饰。
3.抽象类不可以用new创建对象,因为调用抽象方法没意义。
4.抽象类中的抽象方法要被调用,必须有子类复写其所有的抽象方法后,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么子类仍然是抽象类。
抽象类比一般类多了抽象函数。
抽象类不可以被实例化。
抽象只能用来修饰类和方法。
特殊:
抽象类可以不创建抽象方法,这样做仅仅是不让该类创建对象。
模板方法设计模式:
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分,在使用不确定的部分,那么这时就将不确定的部分暴漏出去,由该类的子类去完成。
4.this用法
this代表它所在函数所属对象的引用(简单说:
哪个对象在调用this所在函数。
this就代表哪个对象)
this的应用:
当定义类中功能时该函数内部要用到调用该函数的对象时,这时用this来表示这个对象但凡本类功能内部使用了本类对象都用this表示。
this语句用于构造函数之间互调。
this语句只能放在构造函数的第一行,因为初始化语句要先执行
5.关键字final
final:
最终,作为一个修饰符可修饰类、方法、变量。
被final修饰的类不可以被继承,为了避免被继承,被子类复写功能。
被final修饰的方法不能被复写。
被final修饰的变量是常量,只能赋值一次,既可以修饰成员变量也可以修饰局部变量。
常量的书写规范:
所有字母大写,当有多个单词组成时单词间通过下划线(_)连接。
6.接口(interface)
接口:
可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
class用于定义类。
interface用于定义接口。
接口定义时格式特点:
1.接口中常见定义,常量,抽象方法。
2.接口中的成员都有固定修饰符。
常量:
publicstaticfinal ;方法:
publicabstract。
记住:
接口中的成员都是public的。
接口不可以创建对象,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类。
接口可以被类多实现。
接口之间可以多继承。
接口的特点:
1.接口是对外暴露的规则。
2.接口是程序的功能扩展。
3.接口可以用来多实现。
4.类与接口之间是实现关系而且类可以继承一个类的同时实现多个接口。
5.接口与接口之间可以有多继承关系。
基本功能定义在类中,扩展功能定义在接口中。
事物之间的关系:
聚集:
has-a(一个事物中包含另一事物);聚合:
同类事物组成一个集合(如球员与球队的关系);组合:
如手是身体的一部分。
7.构造函数
构造函数特点:
1.函数名与类名相同;2.不用定义返回类型;3.不可以写return语句;
作用:
给对象进行初始化
对象一建立构造函数就被执行
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,当在类中自定义构造函数后默认的构造函数就没有了。
构造代码块:
格式:
{执行语句};作用:
给对象进行初始化,对象一建立就运行而且优于构造函数执行。
构造代码块给所有的对象进行统一初始化而构造函数是给对应的对象初始化。
构造代码块中定义的是不同对象共性初始化内容。
构造函数可以被私有化。
8.理解面向对象
面向过程强调的是功能行为。
面向对象:
将功能进行封装进对象强调具备了功能的对象。
1.面向对象是相对于面向过程而言的。
2.面向对象和面向过程都是一种思想。
3.面向过程强调的是功能行为。
4.面向对象将功能封装进对象,强调具备了功能的对象。
5.面向对象是基于面向过程的。
9.单例模式(Singleton)
饿汉式(先初始化对象,Singleton一进内存就已经创建好了对象)(开发一般用饿汉式):
[java]classSingleton{
privatestaticSingletons=newSingleton();
privateSingleton(){}
publicstaticSingleton getInstance()
{
returns;
}
}
懒汉式(对象时方法调用时才被初始化,也叫做对象的延时加载。
Singleton进内存时对象还没有存在,只有调用了getInstance方法时才建立对象)
[java]classSingleton{
privatestaticSingletons=null;
privateSingleton(){}
publicstaticsynchronizedSingleton getInstance()
{
if(s==null)
{
s=newSingleton();
}
returns;
}
}
改进:
[java]classSingleton{
privatestaticSingletons=null;
privateSingleton(){}
publicstatic Singleton getInstance()
{
if(s==null)
{
synchronized(Singleton.class)
{
if(s==null)
s=newSingleton();
}
}
returns;
}
}
使用原则;定义单例建议使用饿汉式。
10.封装
封装;指隐藏对象属性和实现细节仅对外提供公共访问方式。
好处:
1.将变化隔离;2.便于使用;3.提高重用性;4.提高安全性
封装原则:
1.将不需要对外提供的内容隐藏起来;2.把属性都隐藏提供公共方法对其访问。
Java中的函数本身就是一个最小的封装体。
private私有权限修饰符,私有只在本类中有效。
私有不是封装,私有仅仅是封装的一种表现形式。
成员变量都有默认值存储在堆内存中。
11.继承
继承:
1.提高代码复用性。
2.使类与类之间产生关系,有了这个关系才有了多态的特性。
注意:
不要为了获取其他类的功能简化代码而继承,必须是类与类之间有所属关系才可以继承。
所属关系is-a。
java语言:
只支持单继承,不支持多继承,因多继承会带来安全隐患(当多个父类中定义了相同功能,当功能内容不同时,子类不确定要运行哪一个。
但是java保留了这种机制,并用另一种体现形式来完成表示:
多实现。
)
java支持多层继承。
1.变量:
如果子类中出现非私有同名成员变量时,子类要访问本类中的变量用this,子类要访问父类中的同名变量用super。
this代表本类对象的引用,super代表父类对象的引用。
2.函数:
当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。
如同父类的函数被覆盖一样,这是函数的另一个特性重写(覆盖override)
3.子父类中的构造函数:
先执行父类的构造函数再执行子类的构造函数。
在对子类函数进行初始化时父类的构造函数也会运行,是因为子类的构造函数默认第一行有一条隐式语句,super();super会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是:
super();
为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时需要先查看父类是如何对这些数据初始化的。
所以子类在对象初始化时,要先访问以下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
super语句一定要定义在子类的构造函数的第一行。
子类的所有构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的构造函数。
当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
子类中至少会有一个构造函数访问到父类中的构造函数。
没有条件的递归就是死循环。
覆盖:
1.子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
2.静态只能覆盖静态。
重写:
子类和父类方法一模一样。
重载:
只看同名函数的参数列表。
12.Java的编译方式
Java有两种编译方式:
(1)直接把源代码编译成和本地机器平台相关的机器语言,叫即时编译;
(2)把源文件编译成一种中间的字节码与机器平台无关叫解释型。
13.匿名对象
匿名对象使用方式一:
当对象的方法只调用一次时可以用匿名对象来完成。
这样写比较简化如果对一个对象进行对个成员调用必须给这个对象起名字,匿名内部类调用成员变量无任何意义。
匿名对象使用方式二:
可以将匿名对象作为实际参数进行传递。
14.泛型
泛型是JDK1.5出现的新特性,用于解决安全问题是一个类型安全机制。
好处:
1.将运行时期出现的ClassCastException问题转移到编译时期,方便程序员解决问题,让运行时期问题减少,安全。
2.避免了强制转换的麻烦。
泛型格式:
通过<>来定义要操作的引用数据类型。
泛型应用场合:
通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的。
当使用集合时,集合中要存储的数据类型作为参数传递到<>即可。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展,现在定义泛型来完成扩展。
泛型类:
泛型可以定在类上也可以定义在方法上。
泛型类定义的泛型在整个类中有效,如果被方法使用,那么泛型类明确要操作的具体类型后,所有要要操作的类型都已经确定了。
为了让不同方法可以操作不同类型而且类型不确定,那么可以将泛型定义在方法上。
泛型方法:
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定可以将泛型定义在方法上。
静态泛型方法:
泛型定义在接口上:
>表示引用数据类型不明确,?
通配符
泛型限定:
extendsE>可以接受E类型或者E的子类,上限。
superE>可以接受E类型或者E的父类
15.String类
字符串是一个特殊的对象一旦被初始化就不能改变。
publicfinal classString
equals方法比较内存地址值。
常见字符串操作:
1.获取
1.1字符串中包含的字符数也就是字符串的长度。
intlength():
获取长度
1.2根据位置获取位置上的某个字符
charchartAt(intindex):
1.3根据字符获取该字符在字符串中的位置
intindexOf(intch):
返回的是在字符串中第一次出现的位置
intindexOf(intch,intindexFrom):
从fromIndex指定位置开始获取字符ch在字符串中出现的位置。
intindexOf(String str):
返回的是str在字符串中第一次出现的位置
intindexOf(Stringstr,intindexFrom):
从fromIndex指定位置开始获取str在字符串中出现的位置。
int lastIndexOf(String str):
返回的是str在字符串中最后一次出现的位置
2.判断
2.1字符串中是否包含指定字串
booleancontains()
特殊之处:
indexOf(Stringstr)返回str在字符串中第一次出现的位置,若果返回-1则表示该字符串中不包含stry因此也可以用来判断字符串是否包含某个字串。
2.2字符串中是否有内容
booleanisEmpity():
判断字符串长度是否为0.
2.3字符串中是否以指定内容开头
booleanstartsWith(Stringprefix)
2.4字符串是否以指定内容结尾
booleanendsWith(Stringstr)
2.5判断字符串的内容是否相同(复写Object类中的equals方法)
booleanequals(Stringstr)
2.6判断字符串长度是否相同并忽略大写小
booleanequalsIgnoreCase()
3.转换
3.1将字符数组转换为字符串
构造函数:
Strirng(char[]arry)
String(char[]arry,intoffset,intcount):
将字符数组中的一部分转换为字符串
静态方法:
staticStringcopyValueOf(char[]arry)
staticStringcopyValueOf(char[]arry,intoffset,intcount)
staticStringValueOf(char[]arry)
staticStringValueOf(char[]arry,intoffset,intcount)
3.2将字符串转换为字符数组
char[]toCharArray()
3.3将字节数组转换为字符串
Strirng(byte[]arry)
String(bytear[]arry,intoffset,intcount):
将字节数组中的一部分转换为字符串
3.4将字符串转换为字节数组
byte[]getBytes()
3.5将基本类型转换为字符串类型
staticStringvalueOf(int|double|short|char(基本数据类型)data)
特殊:
字符串和字节数组在转换过程中是可以指定编码表的。
4.替换
Stringreplace(charoldChar,charnewChar)
Stringreplace(CharSequencetarget,CharSequencereplacement)
5.切割
String[]split(regex)
6.子串(获取字符串中的一部分)
StringsubString(intbeginIndex)
StringsubString(intbeginIndex,intendIndex)(包含头不包含尾)
7.转换、去除空格、比较
7.1将字符串转换为大写或小写
StringtoUpperCase()
StringtoLowerCase()
7.2将字符串两端多余空格去除
Stringtrim()
7.3对两个字符串进行自然顺序的比较
intcompareTo(StringanotherString)
StringBuffer是一个容器它可以对字符串进行增删,StringBuffer是长度是可变的。
publicfinalclassStringBuffer
StringBuffer特点:
1.长度可变。
2.可以一次操作多个数据类型。
3.通过toString方法转化为字符串
1.存储
StringBufferappend():
将指定数据作为参数添加到已有数据尾处。
StringBufferinsert(index,data):
在指定位置处插入数据。
2.删除
StringBufferdelete(start,end):
删除缓冲区中的数据包含start,但不包含end。
StringBuffer deleteCharAt(index):
删除指定位置的字符。
3.获取
StringBuffercharAt(index)
intindexOf()
intlastIndexOf()
StringsubString(start,end)
4.修改
replace(intstart,intend.Stringstr)
voidsetCharAt(intindex,charch)
5.翻转
StringBufferreverse()
6.voidgetChars(intsrcBigin,intsrcEnd,char[]dest,intdstBegin)将缓冲区中的指定字符保存到字符数组。
StringBuilder:
StringBuffer的简易替换,不保证线程安全。
JDK1.5出现StringBuilder,与StringBuffer的区别是:
StringBuffer是线程同步的,StringBuilder是线程不同步的。
升级三个因素:
1.提高效率2.简化书写3.提高安全性
16.Jar包
好处:
1.方便与项目的携带。
2.方便使用,只要在classpath中设置jar路径即可。
3.数据库驱动,SSH框架等都是以jar包体现。
jar包的使用:
17.异常
异常:
程序在运行时出现的不正常情况。
异常的由来:
问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:
两种:
一种是严重的的问题;一种是非严重的问题。
对于严重的java通过Error类进行描述。
对于非严重的java通过Exception进行描述。
对于Error一般不编写针对性的代码对其进行描述。
对于Exception可以使用针对性的处理方式进行处理。
Throwable(直接子类:
Error类 Exception类)
java异常处理的机制:
try{
被检查代码块
}catch(异常类 变量){
处理异常的代码(处理方式)
}finally{
一定被执行的语句
}
对捕获到的异常对象常见方法操作:
1.String getMessage() 2.StringtoString() 3.voidprintStackTrace() jvm默认的异常处理机制就是在调用printStackTrace()方法,打印异常在堆栈中的跟踪信息。
在函数上声明异常,便于提高安全性让调用者进行处理,不处理编译失败。
对多异常的的处理:
1.声明异常时建议声明为更具体的异常。
这样处理的可以更具体。
2.声明几个异常就对应几个catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建议在进行异常处理时,catch中一定要定义具体处理方式。
当在函数内部出现throw抛出异常对象,那么就必须给出处理动作。
要么在内部try-catch处理要么在函数上声明让调用者处理。
一般情况在函数内出现异常,函数上需要声明。
自定义异常:
必须是自定义类继承Exception。
继承Exception的原因:
异常体系有一个特点,因为异常类和异常对象都被抛出。
他们都具有可抛性,这个可抛性是Throwable这个体系独有的特点。
只有这个体系中的类和对象才可以被throws和throw操作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 向东 Java 学习 笔记