java笔记1.docx_第1页
java笔记1.docx_第2页
java笔记1.docx_第3页
java笔记1.docx_第4页
java笔记1.docx_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA基础一、变量(就是数据,是存储在内存中的数据单元)变量就是数据的变现形式;变量在逻辑层面,模仿了自然语言中的代词。Java 变量的语法规定(Java是强类型的语言!)1) 变量有明确类型;2) 变量必须声明,并且初始化以后才能使用;3) 变量有作用域,离开作用域自动回收(销毁);作用域:变量的有效范围,从声明开始到块的结束。4) 在同一作用域中,变量不能重复声明;5) 变量值可以再次赋值、修改。违反以上规则将有编译错误二、进制基础1、十进制基本规则:逢十进一进位基数:10数字:09权:1,10,100,1000权是基数的幂:10n2、二进制基本规则:逢二进一进位基数:2数字:0、1权:1,2,4,8,16,32权是基数的幂:20,21,22,23,24,250100 0100=1*27+1*22计算机内部只有二进制(补码)。计算机默认将二进制转换为十进制字符串输入输出,这是由算法实现的。二进制补码 是利用算法处理负数问题。 补码(4位) 1)将高位的1的作为负数使用; 2)计算的时候,超过4位的数字,自动溢出舍弃。 3)4位补码表示范围:-87。 4)在不超过范围计算的时候,满足数学规则. 5)补码规则-n = n+1. 例:求-4 4:0100 取反:1011 +1:1100 即-4=1100十六进制是二进制每4位为一个单位的简写形式引进十六进制的目的:简便书写2进制数据。十进制转换为十六进制方法:先转换成二进制数,在简写成十六进制数。/了解数据范围,不要进行超范围计算/要在工作中避免超范围计算/直接量(字面量):就是直接写出的常数,如5 0x18/直接写出的整数字面量都是int型/L或者l 后缀的整数直接量是long型long类型经常用来处理时间数据一 基本数据类型 数据类型分为两类:基本类型,引用类型(面向对象) 1)整数型(都是有符号/即补码): byte,short,int,long byte: 8位补码; short: 16为补码; int: 32位补码;有效位数31 long: 64为补码; 2)浮点型: float,double 精确程度:由有效位数长度决定 大小范围:由指数大小决定 float: 32位数字,其中1位符号位,8位指数位(2128),23位尾数; double:64位数字,其中1位符号位,11位指数位,52位尾数; int有效尾数31; float的精度没有int大,但是float范围大于int; 结论:大多使用double型(因为double的有效尾数大于int,不会造成精度损失); * D为后缀的是double类型字面量 * f为后缀的是float类型字面量 * l为后缀的是long类型字面量 * 默认浮点数字面量类型是double类型 3)字符型: char 字符就是一个数! 字符可以由字符字面量(如a)直接赋值,但它的本质是一个整数; 字符是整数,其范围:065535(包含英文,中文(20000+),控制字符; 不是所有字符都可以打印输出的! 对于不方便输入的字符采用转义字符表示; u4e2d是16进制形式的字符编码,u是前缀 4)布尔型: boolean 用来表示真,假,有两个字面量true false 基本类型的转换 1)自动类型转换(隐式类型转换):从小类型到大类型可以自动转换; 符号位扩展:自动转换时负数在高位补充数个1的现象 2)强制类型转换:从大类型到小类型需要强制转换符,会造成精度损失或者溢出; 二 运算符 算数运算 1)+ - * / % 2)+ - * 数学运算符 * 与真实的数学运算有些差别 * 1) 运算的封闭性:同种类型参与运算,得到的同种类型; * 类型不同时,会自动转换类型; * 2) 运算结果会自动溢出,运算不检查溢出; * 3) 小于32位的数,按照32位计算; * 4) 字面量在编译期间计算为一个字面量(字面量和变量的处理规则是不同的!) 除法:整数的除法是整数! 自增(自减)运算: + - 后+,计算步骤: 1)取a的值1,作为a+表达式的值 2)将a加1,a为2 前+运算步骤 1)将a加1,a为2 2)取a的值2,作为+a达式的值 赋值表达式,与赋值运算 b=a;这时赋值表达式,赋值表达式是由值的,是将所赋的值的结果 加减法的优先级高于赋值 复合赋值运算 +=,-=,*=,/=等 int字面量的值不超过byte范围时,可以直接赋值给byte; 例:byte b= 0x03; 但是,byte b= 0xff (即b=-1) 是不行的,因为等号右侧的0xff默认为int型,其int的字面量大于byte 的范围,这种情况应写成byte b= 0xffffffff 或者 byte b=(byte)0xff 关系运算符, =, 执行表达式1boolean表达式为false - 执行表达式2 字符串连接运算符 +的运算符重载现象 运算符重载:用两种不同表现的+运算 Java 中只有一种运算符重载+; 在Java中,+是重载的运算符! 三种程序结构 顺序/分支/循环一 分支结构1) if(布尔表达式) 语句块 switch case 与 if else if else 的差别switch case1)switch 入口条件必须是整数表达式(byte,short,char,int,没有long),即可以自动转换成int类型的类型.也可以使枚举类型,在JDK1.7后,也可以是String类型2)case整数常量:必须是整数常量,不能使表达式3)switch case限制条件很多,但是性能好,效率高if else1)if else 分支条件是任何的布尔表达式,非常灵活宽泛;2)每个条件逐一计算,根据计算结果逐一比较判断3)相对于 swith 性能差些实际常用if else 多路分支;但是在要求性能的情况下选用swith case;for循环for(int i=0;i10;i+)for(int i=1,k=2;i1-2-true-1-2-false-结束数组数组:类型相同的一组变量;语法: 1)数组变量 (引用类型变量) 2)数组对象(数组) 3)数组元素 数组=集合 A=3,4,5 A:数组变量 3,4,5 :数组对象 3:数组元素变量类型:基本类型变量(int long.)和引用类型变量 除了基本类型变量都是引用类型变量 String s;/引用类型变量 int ary;/引用类型变量 三种创建数组的对象的方式么有差别 1)new int100 适合创建数组时候不知道元素,或者数组元素很多的情况 2)new int3,4,5,6 适合知道元素,数量较少时候 3)int arr=4,5,6,7 只能用于声明变量时候同时初始化 数组元素的访问;(用下标) 方法:语言上的动词用于封装算法,从而实现重复调用.语法:public static int f(int x)public static:修饰词,在OOP阶段详细讲解;int:返回值类型,是方法计算以后返回的结果.Java方法必须定义返回值,没有返回值使用void定义如果声明了返回值,就必须用return语句返回一个值.f :方法名,建议方法名与方法功能一致.一般以小写字母为开始,第二个单词首字母大写.(int x):方法参数列表,是方法功能的前提条件.(即方法需要导入这些参数,有这些参数方法才能执行): 方法体.是方法的算法语句块 arrays核心API 提供了常用的数组相关算法(方法),是数组的工具类.可以简化数组操作. Arrays.toString(数组)-用字符串类型表示数组(将数组元素连接为字符串),输出样式:元素1,元素2,.,元素n 可以简化数组内容的输出. 例: String s = Arrays.toString(arr);/将数组转换成字符串形式表示 System.out.println(Arrays.toString(arr);/数组转换成字符串形式打印出来 Arrays.sort() 排序方法(由小到大) System.arraycopy() 方便输出数组内容 ,不够灵活 Arrays.binarySearch() 二分查找,必须在排序数组上查找(否则结果不确定),返回值是查找对象在数组中的下标,返回值是负数表示没有查到.在未排序的数组上查找结果不确定!排序:sort 一般指由小到大的次序有序:order 只是有先后次序数组都是有序的,但不一定是排序的. Arrays.copyOf(original, newLength) 复制数组(Java1.5以后),简洁方便 original : 源数组(从哪复制) newLength: 复制长度(从源数组复制多少元素) 等同于System.arraycopy(src, 0, dest, 0, src.length) System.arraycopy(src, srcPos, dest, destPos, length) 复制数组,灵活,可以复制部分数组 src: 源数组(从哪赋值) srcPos: 源数组位置(从源数组的哪里开始赋值(下标值) dest: 目标数组(复制到哪个数组) destPos: 目标数组的位置(复制到目标数组的哪里开始(下标值) length: 复制长度(从源数组复制多少元素)数组变量的赋值,与数组的复制 的差别1)赋值/ary1变量引用了数组对象new int1,2,3/ary1变量的值是数组对象的首地址(数值)/先建立的数组对象new int1,2,3,再把数组对象的首地址给ary1int ary1=new int1,2,3;int ary2=ary1;/数组变量的赋值.ary1将首地址赋值给ary2/赋值结果ary1和ary2引用了同一个数组对象ary20+;System.out.println(Arrays.toString(ary1);/2,2,3/即两个数组变量,一个数组(数组对象)/表面修改了ary2,但是由于ary1与ary2对应的同一个数组对象,因而影响了ary12)复制 先创建新数组对象,然后复制数组内容,不会出现上面的现象数组的扩容:建立一个新数组(比旧数组长),将旧数组复制到新数组,再添加新元素 数组的扩容,扩容算法 1)数组对象的长度是不可改变的 2)数组变量的值改变,引用了新数组对象(新数组对象更长),原数组被复制进新数组后,原数组被丢弃; 所谓扩展,就是新建一个更大的数组,并将原有数组内容复制到其中 递归:在过程(或方法)中调用了过程(方法)自身一定要有递归结束条件;递归层次不能太多.移位运算(类似于10进制移动小数点的运算)左移()(高位是1则补1,高位是0则补0),逻辑右移()移位运算针对于整数做二进制位移动左移相当于乘以2的n次幂右移相当于除以2的n次幂掩码运算位运算符 &,|,正数对2的整次幂运算可以换成-day02-一 基本数据类型 数据类型分为两类:基本类型,引用类型(面向对象) 1)整数型(都是有符号/即补码): byte,short,int,long byte: 8位补码; short: 16为补码; int: 32位补码;有效位数31 long: 64为补码; 2)浮点型: float,double 精确程度:由有效位数长度决定 大小范围:由指数大小决定 float: 32位数字,其中1位符号位,8位指数位(2128),23位尾数; double:64位数字,其中1位符号位,11位指数位,52位尾数; int有效尾数31; float的精度没有int大,但是float范围大于int; 结论:大多使用double型(因为double的有效尾数大于int,不会造成精度损失); * D为后缀的是double类型字面量 * f为后缀的是float类型字面量 * l为后缀的是long类型字面量 * 默认浮点数字面量类型是double类型 3)字符型: char 字符就是一个数! 字符可以由字符字面量(如a)直接赋值,但它的本质是一个整数; 字符是整数,其范围:065535(包含英文,中文(20000+),控制字符; 不是所有字符都可以打印输出的! 对于不方便输入的字符采用转义字符表示; u4e2d是16进制形式的字符编码,u是前缀 4)布尔型: boolean 用来表示真,假,有两个字面量true false 基本类型的转换 1)自动类型转换(隐式类型转换):从小类型到大类型可以自动转换; 符号位扩展:自动转换时负数在高位补充数个1的现象 2)强制类型转换:从大类型到小类型需要强制转换符,会造成精度损失或者溢出; 二 运算符 算数运算 1)+ - * / % 2)+ - * 数学运算符 * 与真实的数学运算有些差别 * 1) 运算的封闭性:同种类型参与运算,得到的同种类型; * 类型不同时,会自动转换类型; * 2) 运算结果会自动溢出,运算不检查溢出; * 3) 小于32位的数,按照32位计算; * 4) 字面量在编译期间计算为一个字面量(字面量和变量的处理规则是不同的!) 除法:整数的除法是整数! 自增(自减)运算: + - 后+,计算步骤: 1)取a的值1,作为a+表达式的值 2)将a加1,a为2 前+运算步骤 1)将a加1,a为2 2)取a的值2,作为+a达式的值 赋值表达式,与赋值运算 b=a;这时赋值表达式,赋值表达式是由值的,是将所赋的值的结果 加减法的优先级高于赋值 复合赋值运算 +=,-=,*=,/=等 关系运算符, =, 执行表达式1boolean表达式为false - 执行表达式2 字符串连接运算符 +的运算符重载现象 运算符重载:用两种不同表现的+运算 Java 中只有一种运算符重载+; 在Java中,+是重载的运算符! 三种程序结构 顺序/分支/循环一 分支结构1) if(布尔表达式) 语句块 switch case 与 if else if else 的差别switch case1)switch 入口条件必须是整数表达式(byte,short,char,int,没有long)2)case整数常量:必须是整数常量,不能使表达式3)switch case限制条件很多,但是性能好,效率高if else1)if else 分支条件是任何的布尔表达式,非常灵活宽泛;2)每个条件逐一计算,根据计算结果逐一比较判断3)相对于 swith 性能差些实际常用if else 多路分支;但是在要求性能的情况下选用swith case;for循环for(int i=0;i10;i+)for(int i=1,k=2;i1-2-true-1-2-false-结束数组数组:类型相同的一组变量;语法: 1)数组变量 (引用类型变量) 2)数组对象(数组) 3)数组元素变量类型:基本类型变量(int long.)和引用类型变量 除了基本类型变量都是引用类型变量 String s;/引用类型变量 int ary;/引用类型变量 三种创建数组的对象的方式么有差别 1)new int100 适合创建数组时候不知道元素,或者数组元素很多的情况 2)new int3,4,5,6 适合知道元素,数量较少时候 3)int arr=4,5,6,7 只能用于声明变量时候同时初始化 数组元素的访问;(用下标) -day05-方法:语言上的动词用于封装算法,从而实现重复调用.语法:public static int f(int x)public static:修饰词,在OOP阶段详细讲解;int:返回值类型,是方法计算以后返回的结果.Java方法必须定义返回值,没有返回值使用void定义如果声明了返回值,就必须用return语句返回一个值.f :方法名,建议方法名与方法功能一致.一般以小写字母为开始,第二个单词首字母大写.(int x):方法参数列表,是方法功能的前提条件.(即方法需要导入这些参数,有这些参数方法才能执行): 方法体.是方法的算法语句块JAVA OOPJava语言在执行的时候,内存结构就反映:数据结构+算法其中:数据存储在堆(对象:只有数据)和栈(局部变量)中,算法(类和方法)都存储在方法区OOPobject:对象(东西) 一切存在的物都是对象一切皆对象对象:代表客观存在的物体,本质上市堆内存中的数据结构类:是物体的类型,本质上是对象数据结构的模板引用:是对象的代词,本质上存储的对象堆内存地址,是操作对象的句柄.访问对象的属性,就是利用引用来访问方法:是对象的功能,本质上是对对象的数据进行计算实现功能方法就是数据结构的计算方法(算法).在方法中使用this引用被计算的当前对象.所有对象共享同一个方法区中的方法.方法重载 重载 体现的行为多态(比如打,有打车,打电话,打牌等) 重载的语法: 方法名一样,参数不同的方法 重载的方法的调用,根据参数不同调用不同的重载方法. 重载的方法是用方便,表现优雅 null 当引用变量的值是null,并对引用变量进行访问时,发生空指针异常(因为null不指向任何对象)引用变量不是对象引用变量的值是对象的首地址,是对象的存储位置引用变量对象通过地址引用对象引用变量本身是一个数字(被引用对象的地址数字)引用变量的赋值为null时候,不存储任何地址,不引用任何对象,表示变量是空的构造器: 构造器(constructor)构造方法 构造器用于创建(初始化)对象,本质上是分配堆内存,初始化对象的属性 构造器Point(3,5)用于创建初始化Point对象,其中(3,5)是初始化参数,用于初始化Point对象的属性 Point p=new Point(3,5); 构造器的语法:1)构造器的方法名必须与类名一致2)可以有构造器参数,是创建对象的前提条件 如:创建Point的前提条件是(3,5)3)不能申明返回值类型(void也不能有)4)使用new运算调用,new运算结果是 对象实例5)构造器可以重载,参数一定不同 在一个包里面类名不能重复 比较 方法 和 构造器 语法方面 1)构造器的名字必须与类名一致!方法名一般不能与类名相同 2)构造器不能声明返回值方法必须声明返回值,无返回值使用void 3)方法是应用调用,构造器必须使用new运算调用 调用方面 1)方法是用来作为对象的功能的,如点的移动,格子的下降等 2)构造器是用于创建初始化对象的 默认构造器现象: 根本原则:Java类一定有构造器 1)如果没有声明构造器,Javac会在编译时候插入默认构造器声明代码 2)如果Java类中声明了构造器,Javac就不再提供默认构造器注意:Java 构造器调用规则:构造器名+参数列表默认构造器是无参数构造器this 关键字,是在方法中 引用 调用方法的 当前对象(谁调用方法,谁就传递给this) * this 是一个当前类类型引用变量,本质上是方法的第一个隐含参数,在调用的时候 方法调用者 传递给 this 在不能区分局部变量row和实例变量this.row的时候,不能省略this 例:class Cellint row;public void drop(/*Cell this,*/int n)int row =this.row+n;/这里的row是局部变量,作用域在drop方法体内this.row=row; 利用this()重复利用构造器逻辑 this() 不是this.; this():在构造器中第一行使用,调用本类的其他构造器 this. 是在构造器或者方法中引用调用当前方法的对象 继承(extends) 例 public class Circle extends Shape 子类型继承了父类型的属性和方法 带来了好处:子类型不用再声明属性x,y以及方法down; 同类在同一个包中,默认相互可见 extends关键字可以实现类的继承. 子类(Sub class)可以继承父类(Super class)的成员变量和成员方法.同时也可以扩展定义子类型的成员变量和方法. ava语言不支持多重继承,一个类只能继承一个父类,但一个父类可以有多个子类 向上造型(多态) 一个子类的对象可以向上造型为父类的类型 父类型定义的引用变量可以引用子类型实例 Java编译器根据 变量类型 检查调用方法和属性 是否匹配 即,父类型定义的引用变量只能有父类型定义的属性和方法.根本原因: 编译期间因为没有运行,所以没有对象,Java编译器没有办法按照对象检查属性和方法 编译看左边,运行看右边:调用方法的时候,父类必须有调用的方法,运行时,若子类重写了方法,运行子类的方法,若没有,运行父类的方法 属性看左边,方法看右边:调用属性的时候,只能调用的父类有的属性 继承中的构造方法子类不能继承父类型的构造方法子类构造器中一定调用父类型构造器,无论子类构造器是否有参,都会默认调用父类无参构造器.子类的构造器可以通过super()调用指定的父类构造器.如果子类的构造方法(有参或无参)中没有调用父类的构造方法,Java编译器会自动加入对父类的无参数的构造方法的调用(若父类没有无参数的构造方法,会有编译错误)什么可以继承:属性 都被继承(私有的属性在子类中不可见)方法 私有的方法不被继承构造器不被继承编程建议:类一定定义无参数构造器,解决继承中构造器的麻烦 方法的重写Overwrite子类型可以重写(覆盖 )继承自父类型的方法,即方法名和参数列表与父类型的参数列表相同,但方法的实现不同.当子类型对象的重写方法被调用时(无论是通过子类型的引用调用,还是通过父类型的引用调用),运行的是子类型重写后的版本在子类型重写的方法中,可以通过super关键字调动父类型的原始方法可以继承的方法 可以重写;私有的方法不能被继承,所以不能重写子类重写的方法权限必须大于等于父类方法的权限.子类的返回值类型必须是父类返回值类型的子类或本身.子类重写方法时可以:不处理异常(不设定throws);仅抛出父类定义的部分异常;抛出父类定义的异常的子类异常.子类重写方法时不可以:不可以throws父类方法没有声明的异常;不可以throws父类方法声明异常的父类异常;重写的目的:子类型修改父类型的方法! 重写方法调用规则:动态绑定到运行期间具体对象类型 的方法 重写和重载的调用规则区别:重载(Overload):方法名一样,参数列表不同的方法!,返回值类型可以一样也可以不同 重载方法调用规则:根据参数类型调用不同的方法(由参数类型决定)重写/覆盖(Overwrite):子类型中定义域父类型方法名和参数列表都一样的方法!目的是子类型修改父类型的方法子类的返回值类型必须是父类返回值类型的子类或本身.子类重写的方法权限必须大于等于父类方法的权限. 重写的方法调用规则:动态绑定到运行期间具体对象类型 的方法(由对象类型决定) 重写的方法抛出的异常必须是父类方法抛出异常的子类或本身. public 和private * * public:公共,可以修饰属性,方法,类,等 * 共有的属性,在任何地方都可以访问 * * private:私有,只能修饰类的成员,方法. * 可见范围:类内部 * * 默认修饰(不写修饰词):可以修饰属性,方法,类等, * 可见范围:类内部和包(package)内部 * * protected:保护的,可以修饰类的成员,属性,方法等 * 可见范围:类内部,包内部和子类中 * * Noo类和Demo09类是在同一个包(package)中的类* * * * 面向对象3个特征:继承,多态和封装(有且不可见) * * java 推荐使用方法访问属性 跨包访问类,必须有import Java源文件结构: * package 语句: 可以没有(默认包),但是一般都有,必须在第一行 * import 语句 : 必须在package之后. * 作用是导入其他包中的类,(可以是Java API,或者是用户包) * 如果不使用import语句导入,可以使用全限定名访问类! * public class语句: 没有或者只能有一个public类 * * class 语句: 默认修饰的类可以由多个 * 默认修饰的类的可见范围:当前包中可见(同包类) * Java的源文件名必须与公有类类名一致 ,若没有公有类,则和任一class名一致. * * main方法必须在公有类中才能执行 * 默认修饰的类中的main方法不能作为Java入口执行 * * 一般建议:一个源文件只声明一个公有类 当子类与父类有同名属性(变量)时: * 属性访问绑定到变量类型 * 方法访问绑定到对象 1)一般不建议在子类中定义父类同名属性2)属性一般使用方法访问3)this. 是有类型的!访问当前类型的属性4)super. 是父类型变量,可以访问父类的属性5)super() 调用父类构造器了解继承时,对象初始化的过程! static静态变量(静态属性):属于类的属性,只有一份,类似于全局变量实例变量:属于对象的变量,每个对象实例有一个静态关键字用于修饰类的成员,只能在类体中使用一般使用类名访问静态属性,很少使用变量访问静态属性静态方法: * 1)是属于类的方法,用类名访问.静态方法是用类名调用. * 2)静态方法中没有隐含参数this.,不能访问当前对象(this)的属性 * 3)与当前对象无关的情况下,可以使用静态方法实现 * 4)经常用于工具方法的实现.Java API有很多静态工具方法:Math.sqrt() Math.pow() Arrays.sort(). 类里面可以有 语句块 ,在每次创建对象时候执行一次,类似于构造器. 可以用构造器中的语句代替类里面的语句块. 类里面可以声明 静态代码块 ,静态代码块属于类,在类加载期间执行,只执行一次. 用于加载一次性资源:如配置文件等. final final 修饰的类 * final 修饰的类不能再被继承了!没有子类了 * java的API中,String,Math,Integer,Long,Double等是final class * final 修饰的类 一般不常用 final 修饰的方法 * final修饰的方法 不能被 重写 * final修饰的法 一般不常用 final 修饰的变量 * final修饰的变量 初始化后就不能再赋值.final修饰的成员变量必须在声明时初始化. final可以修饰局部变量 *final修饰的变量对应的对象可改; * 若final修饰方法参数,由于方法参数在参数传递时候初始化, 则在方法中不能修改final修饰的参数的值 static final : 常量 常量与字面量(直接量) 例: int c=Card.Three; int i=0; class Cardpublic static final int THREE=0; * Card.THREE是常量,一个有意义的名字,有固定数值 * 0是字面量,就是一个直接给出的固定数值 * 软件中要减少字面量,尽量使用常量,以增加软件可读性 java 默认任何类的父类型都是Object 对象数组 * 对象数组:元素是是引用类型(对象),不是基本类型 的数组 * 创建对象数组的时候,数组元素默认初始化为null 数组对象:数组的对象 对象数组:引用类型对象组成的数组 abstract 抽象的,与具体相反 * 抽象是指不完整的 * 抽象类中经常有抽象方法(不具体的方法,没有方法体的方法),包含抽象方法的类一定是抽象类 * 继承抽象类的子类必须实现抽象方法,即重写 * 抽象类只能被继承,不能实例化(new创建对象,即不能创建抽象类的对象)! * 抽象类可以定义变量,引用具体子类型的实例 * 抽象类的具体子类是多种多样的,是多态的;抽象方法的实现是多种多样的,是多态的方法 抽象类语法的好处 * 将多种子类的公共代码抽象到抽象类中; * abstract关键字可以避免类的实例化; * 抽象类通过抽象方法来约束子类的方法; Timer和TimerTask * Timer:定时器 * Task: 任务 * schedule:计划 * TimerTask:定时任务,其他包含抽象方法run() * 定时器(Timer)会在适当的时候执行 定时任务(TimeTask)的run()方法 接口(interface) *接口:是特殊的抽象类,即只包含抽象方法的抽象类.用interface关键字定义接口 *接口不能定义成员变量,但是可以定义常量(这里的常量可以省略修饰词(public static final) *接口中的抽象方法可以省略关键字(public abstract) 接口语法 * 1)使用interface关键字定义 * 2)接口中只能定义常量和抽象方法,方法的修饰词只能是public或没有 * 3)可以省略:public static final,public abstract * 4)接口只能被实现,不能直接实例化 * 5)接口可以作为父类型定义变量,引用子类实例 * 6)接口可以继承接口 * 7)子类可以实现(implements)多个接口(即重写),实现多继承关系 内部类:定义在类内部的类 * 1)内部的意义在于封装,表示这个类是声明在一个类的内部,在类内部有效,避免外部可见,避免冲突; * 2)内部类可以共享访问该外部类的属性/方法 3)若内部类不是static的,创建内部类实例时必须使用外部类实例调用内部类的构造器(new Outer().new Inner() 若内部类是static的,可以直接使用内部类构造器创建内部类实例,(new Inner() 也可通过(new Outer.Inner()方法创建内部类实例 4)静态内部类不能直接引用外部类的非静态属性和方法. 非静态内部类可以引用外部类的一切属性和方法 5)外部类要调用内部类的属性和方法,必须先创建内部类的实例 匿名内部类 * 1) 语法紧凑,常用! * 2) 匿名内部类一定继承于类或实现接口 * 3) 匿名内部类是子类,可以继承重写 * 4)Goo goo1=new Goo();/创建Goo的内部类实例!/是匿名内部类的类体/new Goo()是继承了Goo类,并且同时创建了这个子类的实例,没有子类的类名,所以叫匿名内部类/编译后,在硬盘上存在Demo03$1.calss 局部内部类(定义在方法中的类)中若想使用该方法的局部变量(或参数),这个局部变量必须是final的(见JSD1305_JavaSE_1.day04.TestClass) JAVA SEObject类在java中,Object是继承树种的顶点,换句话说,该类是所有类的直接或间接父类.一切皆对象 由此而来.我们定义的类没有显示的书写extends关键字,那么默认情况下该类就继承自Object类;Object类中定义的方法Object中定义的方法是每个类都应具备的方法;toString()该方法要求返回一个字符串.这个字符串是当前对象的句柄.字符串格式:类名HashCode值.HashCode值即 句柄,也就是 虚拟地址.toString方法toString方法设计的目的是返回一个更有意义的字符串,所以很多时候我们都会在子类中重写toString方法.通常情况下toString方法返回的字符串应该是用来说明这个对象的equals方法equals方法的设计目的是定义对象的比较规则.public boolean equals(Objece obj)基本类型变量中保存的是值引用类型变量中保存的是句柄所以:基本类型用=比较值是否相等. 引用类型用=比较是否为同一个对象. 引用类型用.equals比较对象内容是否相等. equals重写的目的是比较两个对象长得像不像equals比较逻辑中,在比较内容前一定要比较两个对象是否为统一类型Object的equals方法:public boolean equals(Object obj)return this=obj;所以Object的equals没有意义.(与=一样)String类java中用String类封装字符序列.java采用unicode编码在内存中存储字符串.任何一个字符都占用2个字节.java对字符串的处理有一个特点,字符串是不变对象,一旦创建就不会改变.String是引用类型,出于使用方便,java语法允许为该引用类型变量赋值直接量.String的特性(常量池)出于性能的考虑,java会将所有出现的字符串缓存在常量池中.字符串的常量池就是jvm用于管理字符串开辟的一段内存空间.这么做,目的是尽最大可能重用字符串.String也重写了equals方法,用于比较内容是否一致.区分字符大小写equalsIgnoreCase()方法是字符串提供的一个比较方法,用于忽略大小写比较内容.equals比较时应该有一个良好的书写习惯,用 字面量.equals 变量.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论