Java笔记.docx
- 文档编号:11733722
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:33
- 大小:1.48MB
Java笔记.docx
《Java笔记.docx》由会员分享,可在线阅读,更多相关《Java笔记.docx(33页珍藏版)》请在冰豆网上搜索。
Java笔记
javac用于将源代码程序编译成字节码文件,java用于执行字节码文件,在执行时不能指定文件后缀
Java语言是大小写敏感的,在控制台输出信息使用System.out.println("输出的内容");
优秀攻城师的习惯:
1、变量名由多单词组成时,第一个单词的首字母小写,其后单词的首字母大写,俗称骆驼式命名法(也称驼峰命名法),如myAge
2、变量命名时,尽量简短且能清楚的表达变量的作用,做到见名知意。
如:
定义变量名stuName保存“学生姓名”信息
PS:
Java变量名的长度没有限制,但Java语言是区分大小写的,所以price和Price是两个完全不同的变量哦!
任何一个类都是从Object类继承下来的,因此在任何一个类里面都可以重写这个toString()方法。
toString()方法的作用是当一个引用对象和字符串作连接的时候,或者是直接打印这个引用对象的时侯,这个引用对象都会自动调用toString()方法,通过这个方法返回一个表示引用对象自己正常信息的字符串,而这个字符串的内容由我们自己去定义,默认的字符串内容是“类名+哈希编码”。
因此我们可以通过在类里面重写toString()方法,把默认的字符串内容改成我们自己想要表达的正常信息的字符串内容。
this的总结:
this一般出现在方法里面,当这个方法还没有调用的时候,this指的是谁并不知道。
但是实际当中,你如果new了一个对象出来,那么this指的就是当前这个对象。
对哪个对象调用方法,this指的就是调用方法的这个对象(你对哪个对象调用这个方法,this指的就是谁)。
如果再new一个对象,这个对象他也有自己的this,他自己的this就当然指的是他自己了。
第一季
第二章变量和常量
在Java的领域里,基本数据类型变量存的是数据本身,而引用类型变量存的是保存数据的空间地址。
说白了,基本数据类型变量里存储的是直接放在抽屉里的东西,而引用数据类型变量里存储的是这个抽屉的钥匙,钥匙和抽屉一一对应。
Floatdouble区别
1.float是单精度浮点数,内存分配4个字节,占32位,有效小数位6-7位
double是双精度浮点数,内存分配8个字节,占64位,有效小数位15位
2.java中默认声明的小数是double类型的,如doubled=4.0
如果声明:
floatx=4.0则会报错,需要如下写法:
floatx=4.0f或者floatx=(float)4.0
其中4.0f后面的f只是为了区别double,并不代表任何数字上的意义
3.对编程人员来而,double和float的区别是double精度高,但double消耗内存是float的两倍,且double的运算速度较float稍慢。
String是一种常见的引用数据类型,用来表示字符串。
在程序开发中,很多操作都要使用字符串来完成,例如系统中的用户名、密码、电子邮箱等。
.char表示字符,定义时用单引号,只能存储一个字符,如charc='x';而String表示字符串,定义时用双引号,可以存储一个或多个字符,如Stringname="tom";char是基本数据类型,而String是一个类,具有面向对象的特征,可以调用方法,如name.length()获取字符串的长度。
Java中变量的使用规则
1、Java中的变量需要先声明后使用
2、变量使用时,可以声明变量的同时进行初始化;也可以先声明后赋值
3、变量中每次只能赋一个值,但可以修改多次
4、main方法中定义的变量必须先赋值,然后才能输出
5、虽然语法中没有提示错误,但在实际开发中,变量名不建议使用中文,容易产生安全隐患,譬如后期跨平台操作时出现乱码等等
自动类型转换是需要满足特定的条件的:
1.目标类型能与源类型兼容,如double型兼容int型,但是char型不能兼容int型
2.目标类型大于源类型,如double类型长度为8字节,int类型为4字节,因此double类型的变量里直接可以存放int类型的数据,但反过来就不可以了
强制类型转换:
(数据类型)数值
强制类型转换可能会造成数据的丢失,数值上并未进行四舍五入,而是直接将小数位截断。
常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变。
语法:
final类型常量名=值;
程序中使用常量可以提高代码的可维护性。
例如,在项目开发时,我们需要指定用户的性别,此时可以定义一个常量SEX,赋值为"男",在需要指定用户性别的地方直接调用此常量即可,避免了由于用户的不规范赋值导致程序出错的情况。
常量名一般使用大写字符。
注释:
一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的1/3以上。
因此,注释是程序源代码的重要组成部分,一定要加以重视哦!
Java中注释有三种类型:
单行注释、多行注释、文档注释
文档注释以/**开头以*/结束;多行注释以/*开头以*/结束;单行注释以//开头行末结尾;
PS:
使用文档注释时还可以使用javadoc标记,生成更详细的文档信息:
@author标明开发该类模块的作者
@version标明该类模块的版本
@see参考转向,也就是相关主题
@param对方法中某参数的说明
@return对方法返回值的说明
@exception对方法可能抛出的异常进行说明
第3章运算符
运算符是一种“功能”符号,用以通知Java进行相关的运算。
譬如,我们需要将变量age的值设置为20,这时候就需要一个“=”,告诉程序需要进行赋值操作。
Java语言中常用的运算符可分为如下几种:
Ø算术运算符Ø赋值运算符Ø比较运算符Ø逻辑运算符Ø条件运算符
条件运算符(?
:
)也称为“三元运算符”。
语法形式:
布尔表达式?
表达式1:
表达式2
运算过程:
如果布尔表达式的值为true,则返回表达式1的值,否则返回表达式2的值
运算符优先级
比较运算符
1、>、<、>=、<=只支持左右两边操作数是数值类型
2、==、!
=两边的操作数既可以是数值类型,也可以是引用类型
第四章条件语句
Switch语句:
1、switch后面小括号中表达式的值必须是整型或字符型
2、case后面的值可以是常量数值,如1、2;也可以是一个常量表达式,如2+2;但不能是变量或带有变量的表达式,如a*2
3、case匹配后,执行匹配块里的程序代码,如果没有遇见break会继续执行下一个的case块的内容,直到遇到break语句或者switch语句块结束
第六章数组
数组定义格式:
数据类型[]数组名
数据类型数组名[]
分配空间:
数组名=new数据类型[数组长度]
例如:
Arrays类是Java中提供的一个工具类,在java.util包中。
该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序、搜索等
1.排序:
可以使用sort()方法实现对数组的排序,只要将数组名放在sort()方法的括号中,就可以完成对该数组的排序(按升序排列)。
2.将数组转换为字符串:
可以使用toString()方法将一个数组转换成字符串,该方法按顺序把多个数组元素连接在一起,多个元素之间使用逗号和空格隔开。
3.fill给数组赋值:
通过fill方法。
4.equals比较数组:
通过equals方法比较数组中元素值是否相等。
5.binarySearch二分查找:
使用二分搜索法来搜索指定数组的范围
使用foreach操作数组
foreach并不是Java中的关键字,是for语句的特殊简化版本,在遍历数组、集合时,foreach更简单便捷。
从英文字面意思理解foreach也就是“for每一个”的意思,那么到底怎么使用foreach语句呢?
第7章方法
方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
一般情况下,定义一个方法的语法是:
其中:
1、访问修饰符:
方法允许被访问的权限范围,可以是public、protected、private甚至可以省略,其中public表示该方法可以被其他任何代码调用,其他几种修饰符的使用在后面章节中会详细讲解滴
2、返回值类型:
方法返回值的类型,如果方法不返回任何值,则返回值类型指定为void;如果方法具有返回值,则需要指定返回值的类型,并且在方法体中使用return语句返回值
3、方法名:
定义的方法的名字,必须使用合法的标识符
4、参数列表:
传递给方法的参数列表,参数可以有多个,多个参数间以逗号隔开,每个参数由参数类型和参数名组成,以空格隔开
根据方法是否带参、是否带返回值,可将方法分为四类:
Ø无参无返回值方法Ø无参带返回值方法
Ø带参无返回值方法Ø带参带返回值方法
无参无返回值方法
如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法。
方法的使用分两步:
第一步,定义方法
例如:
下面代码定义了一个方法名为show,没有参数,且没有返回值的方法,执行的操作为输出“welcometoimooc.”
注意哦:
1、方法体放在一对大括号中,实现特定的操作
2、方法名主要在调用这个方法时使用,需要注意命名的规范,一般采用第一个单词首字母小写,其它单词首字母大写的形式
第二步,调用方法
当需要调用方法执行某个操作时,可以先创建类的对象,然后通过
来实现。
无参带返回值的方法不包含参数,但有返回值。
例如:
下面的代码,定义了一个方法名为calSum,无参数,但返回值为int类型的方法,执行的操作为计算两数之和,并返回结果
在calSum()方法中,返回值类型为int类型,因此在方法体中必须使用return返回一个整数值。
调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理。
第二季
类与对象
成员变量默认有初始值,局部变量必须要先自己定义初始值;
两类变量同名时,局部变量具有更高的优先级(就近原则)。
1.成员变量:
在类中定义的,描述对象的属性(有什)
2.局部变量:
在类的方法中定义,在方法中临时保存数据
两者的区别:
成员变量可以被本类中的所有方法使用,也可以在其他的和当前类有关系中的类中使用,局部变量只能在当前的方法中去使用
两者的细节性差别:
(1)作用域问题:
局部变量的仅限于定义它的方法,成员变量在整个类中都可用.
(2)变量初始值问题:
注意在局部变量中必须给其赋初始值之后才能够对其使用,而成员变量可以不赋初始值(3)变量同名问题:
同一个方法中,定义的局部变量不能同名,不同方法中定义局部变量是可以重名(4)变量优先级问题:
成员变量和局部变量同名时
构造方法
1、使用new+构造方法创建新对象
2、构造方法是定义在Java类中的一个用来初始化对象的方法,创建对象时执行了构造方法。
3、构造方法包括无参和有参构造方法,后者不但可以创建对象,还可以给实例对象赋初值。
Java的默认值为0
4、当没有指定构造方法时,系统默认添加无参的构造方法
5、当有指定构造方法时,无论是有参还是无参的构造方法,都不会自动添加无参的构造方法
6、构造方法的重载:
方法名相同,单参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法
new+构造方法创建一个新的对象(创建对象的时候,执行的是构造方法);
构造方法是定义在java类中,用来创建和初始化对象(当创建一个对象的时候,执行构造方法时)的方法;
构造方法与类同名且没有返回值,有参构造方法与无参构造方法;
Telphonephone=newTelphone();当类中没有构造方法,系统会自动生成个无参构造方法,反之,就用构造方法创建对象;
可以用无参构造方法创建对象,也可以用有参构造方法创建对象。
后者不仅可以创建对象还可以给对象中实例变量赋初值;
Static讲解
1.Static之静态变量
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。
然而在某些时候,我们更希望该类所有的对象共享同一个成员。
此时就是static大显身手的时候了!
!
Java中被static修饰的成员称为静态成员或类成员。
它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。
静态成员可以使用类名直接访问,也可以使用对象名进行访问。
当然,鉴于他作用的特殊性更推荐用类名访问~~
使用static可以修饰变量、方法和代码块。
要注意哦:
静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!
~~
2.static之静态方法
1、静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。
如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
2、在普通成员方法中,则可以直接访问同类的非静态变量和静态变量
3、静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法
3.static之静态初始化块
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。
如果使用static修饰初始化块,就称为静态初始化块。
需要特别注意:
静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
我们来看一段代码:
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。
由于静态初始化块只在类加载时执行一次,所以当再次创建对象hello2时并未执行静态初始化块。
封装特性:
只能通过规定的方法访问数据get()set()
封装的实现步骤:
1.修改属性的可见性:
设为private
2.创建get/set方法:
用于属性的读写
3.在get/set方法中计入属性的控制语句:
对属性值的合法性进行判断。
包的作用:
1.管理JAVA文件
2.解决文件名冲突问题
定义包:
package包名
注:
必须放在Java源程序的第一行
包名间可以使用“.”号隔开
eg:
com.imooc.MyClass
包的使用:
1.import关键字
importcom.imooc.music.MyClass
2.java中,包的命名规范是全小写字母拼写。
3.使用的时候不但可以加载某个包下的所有文件
eg:
com.imooc.*
也可以加载某个具体子包下的所有文件
eg:
com.imooc.music.*
访问修饰符
this关键字
1.this关键字代表当前对象
this.属性操作当前对象的属性
this.方法调用当前对象的方法
2.封装对象的属性的时候,经常会使用this关键字
*eclipse中可以直接生成setter/getter方法,具体操作步骤为:
Source->GenerateGettersandSetters
内部类
1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
2.内部类的方法可以直接访问外部类的所有数据,包括私有的数据
3.内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类可分为以下几种:
成员内部类静态内部类方法内部类匿名内部类
成员内部类
内部类中最常见的就是成员内部类,也称为普通内部类。
我们来看如下代码:
从上面的代码中我们可以看到,成员内部类的使用方法:
1、Inner类定义在Outer类的内部,相当于Outer类的一个成员变量的位置,Inner类可以使用任意访问控制符,如public、protected、private等
2、Inner类中定义的test()方法可以直接访问Outer类中的数据,而不受访问控制符的影响,如直接访问Outer类中的私有属性a
3、定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象,即:
内部类对象名=外部类对象.new内部类();
4、编译上面的程序后,会发现产生了两个.class文件
其中,第二个是外部类的.class文件,第一个是内部类的.class文件,即成员内部类的.class文件总是这样:
外部类名$内部类名.class
1、外部类是不能直接使用内部类的成员和方法滴
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
2、如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用this关键字。
如:
静态内部类是static修饰的内部类,这种内部类的特点是:
1、静态内部类不能直接访问外部类的非静态成员,但可以通过new外部类().成员的方式访问
2、如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3、创建静态内部类的对象时,不需要外部类的对象,可以直接创建内部类对象名=new内部类();
继承的初始化顺序:
1.先初始化父类,再初始化子类
2.先执行初始化对象中属性,再执行构造方法中的初始化。
final关键字:
最终,最后
final修饰类,该类不容许修改
final修饰方法,该方法不允许被重写
final修饰属性,属性不能在其他位置修改它的值(只能赋值一次)
final修饰变量,变量被赋值一次后变成常量
super关键字:
在对象的内部使用,可以代表父类对象
访问父类的属性:
super.age
访问父类的方法:
super.eat();
子类的构造的过程中必须调用其父类的构造方法。
1.如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法;
2.如果显示的调用构造方法,必须在子类的构造方法的第一行;
3.如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object类。
Object类中的方法,适合所有子类。
toString()方法(实例:
用于System.out.println(x)输出对象的时候,输出的是哈希码):
在Object类里定义的toString()方法,用于返回对象的哈希code码(对象地址字符串-用来唯一区分对象,如身份证)。
可以重写toString()方法表示出对象的属性,快速在类中重写toString()方法的操作:
Source->GeneratetoString()。
equals()方法,作为object类中重要方法之一,其本身是比较两个对象的地址是否相同。
而在实际使用中,我们大多时候需要比较的是两个对象的属性值是否相同,这样我们就得重写equals方法。
要达到我们的目的我们需要:
1、首先比较两个引用的地址是否相同,如相同,那么同一个地址存储的值必定相同;2、对象是否为空值,若为空值,那一定不同;3、比较两个类对象是否相同,如果不相同那值肯定不同(这里需要注意类对象与类的对象区别:
类对象是指我们创建的新的类对象,其有哪些属性、方法等;而类的对象是指对象的具体属性值。
)4、将比较对象转化为相同的类类型进行属性值比较。
多态:
对象的多态
1、引用多态:
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
如果父类引用指向一个子类的对象,那么通过父类引用,只能调用父类所定义的允许继承的方法。
如果子类重写了继承父类的方法,那么会调用子类中的方法。
2、方法多态:
创建本类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
引用类型转换:
1、向上类型转换(隐式/自动类型转换),小类型转换为大类型(无风险)2、向下类型转换(强制类型转换),大类型转换为小类型(有风险)3instanceof运算符用来解决对象引用类型转换的安全性问题。
对象是传址引用,基本数据是传值引用。
Dogdog=newdog();
Animalanimal=dog;向上类型转换(子类引用转换父类引用)
Dogdog2=(Dog)animal;向下类型转换(父类引用强制转换为子类引用)
Catcat=(Cat)animal无法进行类型转换,会报错。
因为animal其实是引用指向dog类型对象,因此1编译时cat类型2运行时dog类型
instanceof是Java中的关键字,为二元运算符,作用是判断左边的对象是否是右边类的实例,返回值为布尔类型数据。
可以用来判断继承中子类的实例是否为父类的实现。
首先,从意义上讲,父类一般表示较抽象的概念,而子类表示更具体的概念。
一旦你创建子类的实例,就表示你已经了解了它的具体特性,即便你向上转型,也只是表示你暂时不关注具体的特性,但这个实例仍然是具体化的。
就好比你管理一家公司,你一开始为所有员工制定了某项规章制度,后来发现A部门比较特殊,给他们另行制定了这项规章,这就相当于你为“员工”这个父类派生了“A部门员工”这个子类,并覆写了执行该规章的方法。
现在你要号召该所有员工去执行该规章,你会向他们统一发号施令,但是A部门员工默认情况下仍然会按照你为他们制定的特别规章来实施,除非你刻意强调他们也按一般规章。
其次,在程序正确性的保证上,父类可以是一个抽象类,它的某个方法是虚函数,并没有给出实现,该方法在子类里才被实现。
这个时候,你把一个子类向上转型再调用这个函数,如果去调用父类方法的话,程序就会面对这个没有被实现的虚函数而无法执行。
所以,仍然要调用子类覆写的方法。
最后,从实现角度讲,向上转型之后,只不过改变了指针或者对象引用的类型,但它们所指向的内存中的实际对象的类型并没有改变,依然是子类的类型,所以调用方法仍然会是子类的。
抽象类定义
1、语法定义:
抽象类钱使用abstract关键字修饰,则该类为抽象类。
2、应用场景:
a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3、作用:
限制规定子类必须实现某些方法,但不关注实现细节。
4、使用规则:
a、abstract定义抽象类
b、abstract定义抽象方法,只有声明,不需要实现
c、包含抽象方法的类是抽象类
d、抽象类中可以包含普通的方法,也可以没
接口语法
第三季
异常
处理异常:
try-catch以及try-catch-finally;抛出异常;自定义异常;异
catch(Exceptione){
e.printStackTrace();//输出异常的具体信息
}
当try语句中出现异常是时,会执行catch中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)