1、Java知识点串讲,第一章 Java概述,Java程序的编写、编译和执行,编写代码 可使用任何文本编辑软件编写,比如记事本 源代码文件的扩展名为.java 编译 使用JDK的编译命令javac进行编译如:javac Hello.java 编译后生成扩展名为.class的字节码 运行 使用JDK的解释器java运行 如:java Hello,application vs. applet不同点,Java application 由Java解释器独立运行字节码 程序中包含main方法 Java applet 不能独立运行,字节码必须嵌入HTML文档(有标记) 源程序必须是java. applet.
2、Applet 类或javax.swing.JApplet类的子类,一个简单的 application,/Welcome.java public class Welcome public static void main(String args) System.out.println(“Hello World!”); ,源文件名要和该 public类相同,注意String和 System要大写,编写Java源程序的注意事项,Java语言区分大小写,包括文件名 源文件的名字必须和源代码中被public修饰的类相同,如果没有public类可以可以任意命名(不推荐)。 源文件扩展名必须为.java,第
3、二章 基本语法,标识符是用户定义的用于表示变量名、类名、接口名、方法名、方法的参数名等符号。,标识符的命名规则,由字母、数字、下划线_、美元符号$组成 首字母不能是数字 不能是保留字(50个) 标识符区分大小写,练习,下列哪些是合法的标识符: a ,4abc , _test, class 123abc, $test , a,Mr.wangimport ,abc#d ,半径, a1,基本数据类型,Java中共三种基本数据类型: 数值型 字符型 布尔型,数值数据类型,类型名称 位数 表示范围 byte 8 bit -128 127short 16 bit -32768 32767int 32 bi
4、t long 64 bit float 32 bit 七位小数 (单精度浮点数) double 64 bit 十五位小数 (双精度浮点数)char 16bit 16位的Unicode编码,类型转换,精度由高到底排序: double float long int short byte,数值类型转换,总可以将低精度的值赋给高精度类型的变量。 比如:double i=10; 但是,如果不进行强制类型转换,就不能将高精度类型的值赋给低精度类型的变量。,类型转换,类型转换是一种操作,它把一种数据类型的值转换成另一种数据类型。 用于由高精度向低精度要进行强制类型转换;例如:float f = 10.1;(
5、错,浮点型数默认为double型。)float f = (float)10.1;int i = (int)f; 注意:布尔类型不能和任何类型强制转换,数值类型转换,Java中当两个类型不同的运算对象进行二元运算时,Java 自动 把精度较低的类型转换成另一个精度较高的类型。 见书17页类型转换基本规则,算术运算符包括:+, -, *, / 和 %。 整数除法的结果是整数,如5/2= 2而不是2.5,1/20。 运算符%得出除法的余数,如5%2=1 。,算术运算符,赋值运算符,基本赋值运算符(=) 复合赋值运算符(如+=) 注意:赋值运算符=的左边只能是变量,不能是表达式,而右边可以是数值也可以
6、是表达式 如a=a+3 (正确) a=b=2(正确)a=a+5=9(错误,=的左边不能是表达式),增量运算符和减量运算符,前置增量/减量运算符:变量先加1或减1,再参与表达式中的运算。+x 或者 x 后置增量/减量运算符:变量先参与表达式的运算,再加1或减1。x+ 或者 x,比较运算符:返回值是布尔型,运算符 名称 例 结果大于 12 false= 大于等于 1=2 false= 等于 1=2 false!= 不等于 1!=2 true,逻辑运算符:只能对布尔类型操作,运算符 名称 描述! 非 逻辑否定,取反&, & 与 逻辑与,并且|, | 或 逻辑或,或者 异或 逻辑异或,排同,if-el
7、se语句,if (布尔表达式) 布尔表达式为真时执行的语句(组); else 布尔表达式为假时执行的语句(组); ,switch语句,Java提供switch语句来有效的处理多重条件。 switch (表达式) case 值1: 语句组1;break;case 值2: 语句组2;break;case 值N: 语句组N;break;defalut: 缺省语句组; ,注意:表达式结果类型: byte,short,int或者char,while 循环,while循环的语法如下:while (循环条件) / 循环体; ,do循环,do循环是while循环的变体。 do / Loop body; whi
8、le (循环条件);(注意最后的分号!),for 循环,for循环的语法如下:for (循环变量初始化;循环条件;调整语句) /循环体; ,for循环,如果循环条件省略,就意味着条件为真。 下述语句也是正确的 for(;),break和continue关键字,语句break和语句continue,可以用在循环语句中为循环提供附加控制。 break:立刻终止包含它的最内层循环。 continue:只结束当前迭代,将程序控制转移到循环的下一次迭代。,练习,1、P14页强化练习两个或任选一个 2、P17页强化练习两个或任选一个 3、P19页强化练习两个或任选一个 4、P35页强化练习两个或任选一个,
9、第四章 类与对象,类的定义,修饰符 class 类名 属性定义 构造方法定义 方法定义 ,属性定义,语法:表示可有可无 修饰符 类型 属性名= 初值 ; 类型可以是任何类型,包括8种基本数据类型或自定义的引用类型(即属性可以由一个类的对象充当)。 属性有默认值。,方法定义,语法: 修饰符 返回值类型 方法名(参数列表) 语句(组); return语句; ,练习:,编写一个方法,求如下数据的和: 1+1/3+ + +1/n,其中n作为参数传递进去, 同时在main方法里调用该方法。,构造方法用于对象的初始化,构造方法名与类名一致 构造方法没有返回值类型 如果没有定义构造方法,系统会生成一个默认的
10、无参的构造方法 构造方法只能用new在创建对象时调用,不能通过对象名调用,创建对象,创建对象的语法: 类名 对象名 /这是对象的声明 对象名 new 类名();/真正创建对象 调用对象属性和方法的语法: 对象名.属性名 对象名.方法名,练习,定义一个教师类,该类属性有教师的名字,性别,年龄,教师都是有头发的且默认是黑颜色的。试定义构造方法及显示教师基本信息的方法,并定义一个对象将信息显示出来。,方法的重载(概念一定要理解掌握),重载:一个类中如果同时存在多个方法名相同,参数列表不同的方法,则他们之间的关系称为重载。 要求重点掌握该知识点,方法重载,例: int max(int a , int
11、b) double max(double a , double b) int max(int a , int b , int c) 要点:方法名相同、参数列表不同(包括参数数目,参数出现的顺序或参数的类型不同)。返回值类型可以相同也可以不同。,关键字this,this代表类的当前对象 利用“this.”可以调用当前对象的成员 this可以实现构造方法的调用 利用this(参数)可以调用构造方法 必须写在构造方法的第一条,对象做方法的参数,基本数据类型做方法的参数传递的是数值。 对象也可做方法的参数传递的是引用(即地址) 通过画图分析程序,见书上的85页例题。,变量和属性的作用域,属性是定义在类
12、中所有方法外的变量(有默认值);而方法内定义的变量是局部变量(无默认值)。 属性不管在何处声明,它的作用范围是整个类; 局部变量的使用范围是从声明它的那一点到距离它最近的右大括号之间。,方法可直接访问同一个类中的属性,当属性与方法内的局部变量重名时,访问的是局部变量,属性将被隐藏。 题型见网上习题42(三、程序阅读题的6题),包(包中放着好多类),声明包的方法 package 包名称; 注意:package必须写在程序的第一条,引入包中的类,使用其他包中的public类 常用是:关键字 import 包名.类名; 如:import java.applet.Applet; 也可以引入整个包例如:
13、 import java.util.*;,访问控制修饰符(要掌握),类成员的访问控制修饰符 public:包内包外可访问 protected:包内包外子类可访问 默认:包内可访问 private:类内可访问,访问器方法,设置方法 public void set属性名(属性类型的参数) 比如:对属性radius public void setRadius(double radius) 获取方法 属性类型 get属性名() 比如: public double getRadius(),例如:,setRadius(double ra),getRadius()就是一对访问器方法,static,静态属性
14、用static修饰的属性,也称为类属性 用于描述一类对象共享的属性 比如:员工的最低工资,学生的学校名称等等,static,静态方法 用static修饰的方法,也叫类方法 写静态方法时要注意,方法中不能访问非静态成员,不加static修饰的属性或方法,必须用对象去调用。 被static修饰的属性或方法可通过类名直接调用,也可通过对象调用 比如:Teacher例子中可设学校名的属性为静态的,试考虑可以如何调用该属性。,练习,1、4.2.1 P42页强化练习第2个 2、4.2.2 P44页强化练习第2个 3、4.2.4 P56页强化练习第1个 4、4.2.5 P50页强化练习第1个,练习2:,设计
15、一个长方形的类Rectangle; 其中属性包括长length,宽width; 方法包括:默认的构造方法,为长和宽指定初值的构造方法,访问器方法,获取长方形面积的方法; 编写一个测试类,测试上述方法,第5章 继承,继承的语法,修饰符 class 子类名 extends 父类名 类体; 例如:class Apple extends Fruit ,【注】Java只支持单重继承,即只有一个父类的继承关系,要点,在继承中: 子类可以得到父类的属性和方法。 子类可以添加新的属性和方法。 子类可以重新定义父类的属性和方法。 (子类中的内容比父类丰富),属性隐藏,子类可以定义与父类同名的属性,称为属性隐藏。
16、即子类可以重新定义父类的属性。,调用属性的规则:,先在当前类中找,如果没有再到其父类中找。 如果想要调用被隐藏的父类属性,静态属性可以使用“类名.属性名”;非静态属性可以用“super.属性名” 用法见课后习题P156,10题,方法的覆盖,在子类中可以定义与父类方法头相同的方法,称为方法的覆盖。 也可以说,通过方法覆盖,子类可以重新定义父类的方法。,方法覆盖要注意:,子类在重新定义父类中的已有方法时,应保持和父类中该方法相同的方法头,即有完全相同的方法名、返回值类型和参数列表。 方法覆盖时,子类方法不能缩小父类方法的访问权限。比如:父类的方法如果是protected,子类方法只能是protec
17、ted或者public,1)类A和类B是什么关系? 2)类A和类B都定义了x属性和方法toString(),这种现象分别称为什么 3)若a是类A的对象,则a.toString( )的返回值是什么? 4)若b是类B的对象,则b.toString( )的返回值是什么?,继承关系中的构造方法,在创建子类对象时,先调用父类构造方法,然后再调用子类构造方法 默认情况下,子类调用父类无参的构造方法,程序的输出结果,程序的输出结果,更正,super,在子类中调用父类的属性和方法 super指当前类的父类对象,所以不能在静态方法中使用。 在子类构造方法中显示调用父类的构造方法。 必须写在子类构造方法的第一条。
18、,总结:this 和super的用法,this代表当前类的对象;super代表当前类的父类对象。 this可以调用当前类当中的其他构造方法,而super可以在子类中调用其父类中的构造方法。 注意:this和super都不能用在static修饰的方法内;并且this和super不能同时使用,因为都需要放在第一条语句上。,Final使用要点,final可以修饰: 属性或局部变量,不能被修改(常量) 方法,不能被覆盖(最终方法) 类,不能被继承(最终类),abstract使用要点,abstract类 不能实例化,只能用于继承 abstract方法 只有方法头,没有方法体 只能定义在抽象类中 注意:
19、抽象类中可以有具体方法 抽象类中的抽象方法在其非抽象子类中必须实现(覆盖),父子类对象的使用和转化,父子类的对象在某些情况下可以相互转化。,转化原则,子类对象可以当作父类对象使用 父类对象不能当作子类对象使用 如果父类引用实际指向的是子类对象,那么该父类引用可以通过强制转换成子类对象使用,public class Mammal public class Dog extends Mammal public class Cat extends Mammal Mammal m; Dog snoop =new snoop(); Cat kitty =new Cat(); m = snoop ;snoo
20、p =m ; snoop = (Dog) m;kitty=(Cat)m;snnop =kitty;,编译通过,但需要在运行时进行检验,通过,编译通过,但需要在运行时进行检验,运行异常,比如父类是:A,子类是:B B b= new B();/创建子类对象 A a= new B();/创建子类对象但把它定义成父类类型的,它就可以当成父类的来用 (类似于:double i=12,整型的12可以当成浮点数来用),如果一个方法的形式参数定义的是父类的对象,那么在调用这个方法时可以使用子类的对象来作为实际的参数;(因为子类对象就可以当成父类对象来用) 见书139页例题,多态性与方法的动态绑定,多态:一种功
21、能有多种实现。通过方法的重载和覆盖可以实现多态。 动态绑定:方法体的调用是在程序执行时动态决定的。即调用一个方法时看到底是哪个对象在调用方法。而属性不能动态绑定。 见书157-158练习12、14,练习,1、5.2.1 P60页强化练习第3个 2、5.2.2 P71页强化练习第2个 3、5.2.3 P56页强化练习第2个 4、5.2.4 P66页强化练习第2个,练习:,1.定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。 编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性,和计算体积的方法以及计算面积的方法。 编写一个测试类,对以上两个类进行测试,创建一个长方体,
22、定义其长、宽、高,输出其底面积和体积。,第6章 接口和内部类,接口的作用,提供功能规范的、能够多重继承的、特殊的抽象类。 接口中只能定义静态常量和抽象方法。,接口定义的语法,public interface 接口名 extends 父接口列表 / 属性声明public static final 属性类型 属性名 = 常量值 ;/ 方法声明public abstract 返回值类型 方法名 ( 参数列表 ) ; 注意: 1修饰接口的修饰符只有public和默认修饰符两种。 2接口可以是多重继承。接口只能继承接口,不能继承类。 3属性必须是常量(有初值),方法必须抽象(无方法体)。,接口的实现,类
23、通过implements关键字来实现接口。 类必须实现(覆盖)接口中描述的方法。 这就体现接口的好处,会强制实现它的类必须得有并且实现接口中定义的方法,否则该类就不能实例化,类实现接口的语法,class 类名 extends 父类 implements 接口列表 覆盖所有接口中定义的方法; 注意: 1、一个类可以同时实现多个接口,但只能继承一个类 2、类中必须覆盖接口中的所有方法,而且,都是公开的,内部类,也叫做内嵌类,是一种定义在其他类内部的类。 内部类相当于外部类的一个成员 可以访问外部类的所有其他成员 使用受到外部类的限制,练习,1、6.2.1 P74页强化练习第1个 2、6.2.2 P75页强化练习第1个,