级java课程笔记.docx
- 文档编号:6627515
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:32
- 大小:36.18KB
级java课程笔记.docx
《级java课程笔记.docx》由会员分享,可在线阅读,更多相关《级java课程笔记.docx(32页珍藏版)》请在冰豆网上搜索。
级java课程笔记
理论学时:
42个,上机:
6个(3批)
停课(闭卷)考试
考试占75%左右,平时25%左右
点名、实验、一次大作业
本课程的关注点:
与前面的C++不同,语言语法部分自学(要求把C++课本复习一次),关注面向对象的编程方法和设计原则
-课程教学安排
⏹Java编程(数据结构算法)
⏹结合Java语言的OO(ObjectOriented)编程思想
⏹精读设计模式(23种)
⏹Java企业级编程思想(ThinkinginEnterpriseJava)
◆JSP,Servlet
◆JavaWeb开发框架(ApacheCommunity,Struts,Spring,Hibernate)
◆JavaScript(页面表示层,RichClient)
⏹Java语言基础
◆历史
●1991年,Sun公司,Green项目组,开发嵌入式家电分布式软件,这些电子设备品种繁多,标准各异,C++复杂且安全性低,不能满足要求
●设计出一种新的语言,Oak,负责人JamesGosling办公室外有一棵Oak。
这是一种适用于网络编程精巧而安全的语言,保留了C++语法,但去掉了C++不安全的部分。
●1995年,商标冲突,改名为Java,印尼位于印度洋上有个岛,叫Java岛,盛产咖啡,其Logo是一杯咖啡。
●Java的开发者网站:
◆Java语言的特点
●平台无关性(把源代码编译成中间代码,为每一个平台写了一个Java虚拟机,由虚拟机把中间代码翻译成该平台上的指令,代价是执行效率降低)
●完全面向对象和简单性
●可靠性(程序健壮性)
●安全性(Applet的安全性最高)
⏹Application:
桌面应用程序
⏹Applet:
小程序,嵌在网页中
●多线程(Java直接支持,java.lang.Thread)
●直接支持分布式应用(RMI,RemoteMethodInvoke;EJB,EnterpriseJavaBean;J2EE)
⏹开发环境
◆下载和安装JDK(JavaDevelopmentKit):
包含DevTools和JRE(JavaRuntimeEnvironment,JVM实现),JDK提供了命令行方式的开发工具。
,J2SE
◆安装IDE:
Netbeans
◆API文档:
JavaDoc,可以用JDK提供的javadoc工具生成
◆反编译器:
把中间代码还原成源代码
⏹第一个Java程序Helloworld
建一个源文件:
Helloworld.java
publicclassHelloworld{
publicstaticvoidmain(String[]args){
System.out.println(“Helloworld”);//有回车
System.out.print(“Helloworld”);//无回车
}
}
每个要运行的文件都必须有一个public的主类,且文件名要和主类名一样;从主类的main方法开始执行
编译:
javacHelloworld.java生成Helloworld.class(中间代码)
运行:
javaHelloworld(把中间代码放到虚拟机上翻译运行)
通过本地编译器可以把.class转变为.exe
//单行注释
importjava.util.*;
第2行println用到了newDate()
如果不import,就要写成
System.out.println(newjava.util.Date());
简单Java程序举例
例1.求N=3的平方
publicclassEx1{
publicstaticvoidmain(String[]args){
intN=3;
System.out.println(“Resultis”+N*N);
}
}
例2.输出5000句Helloworld。
publicclassEx2{
publicstaticvoidmain(String[]args){
Ex2obj=newEx2();
obj.outputStr(100,”Helloworld”);
}
privatevoidoutputStr(intN,Strings){
for(intk=1;k<=N;k++)
System.out.println(s);
}
}
例3.求N=123456的平方根。
importjava.lang.Math;
publicclassEx3{
publicstaticvoidmain(String[]args){
doubleN=123456;
System.out.println(“Theresultis”+sqrt(N));
}
}
格式化输出字符串,参见Formatter类。
例4.求3x^2-2x-6=0的根。
publicclassEx4{
publicstaticvoidmain(String[]args){
doublea=3,b=-2,c=-6;
doubledelta=b*b-4*a*c;
if(delta<0)return;
doublep=-b/(2*a);
doubleq=java.lang.Math.sqrt(delta)/(2*a);
System.out.println(p+q);
System.out.println(p-q);
}
}
思考题:
输出一个N阶奇数阶幻方,N由键盘输入。
6
7
2
1
5
9
8
3
4
建一个MagicSquare.java
publicclassMagicSquare{
publicstaticvoidmain(String[]args){
intN;
Scannerinput=newScanner(System.in);
N=input.nextInt();
int[][]M=newint[N][N];
intp=N/2,q=0;
for(intk=1;k<=N*N;k++){
M[p][q]=k;
intnext_p=(p-1+N)%N;
intnext_q=(q-1+N)%N;
if(M[next_p][next_q]!
=0){
next_p=p;
next_q=q+1;
}
p=next_p;
q=next_q;
}
//用两个for循环输出M
}
}
-JavaGUI
⏹在Netbeans中构建GUI程序(参考PPT)
⏹把幻方程序升级为豪华版(有界面)(思考题)
-数学类对象
⏹Random,产生随机数
java.lang.Math.random():
返回一个0-1之间的随机数
java.util.Random.nextInt(intn):
返回一个n以内的随机数
返回一个大于等于p但小于等于q的随机数
p+java.util.Random.nextInt(q-p)
p+java.lang.Math.random()*(q-p)
思考题:
用Java语言编写一个猜数游戏
-面向对象的核心概念
⏹抽象
⏹接口
⏹服务
⏹封装
⏹复用
⏹继承:
抽象-具体的关系
水果-苹果-红富士苹果is-a
苹果苹果梨
梨
⏹多态:
同一个样子具有多种含义
我今天吃了饭。
我今天去中华广场吃了日本料理。
我今天和朋友去正佳广场吃了烧肉。
例子:
方法Feed(Animala,Foodf);
Animal-Dog--abcDog
-Cat--xyCat
Food-Bone
-Fish
Animala=newabcDog();
Foodf=newBone();
Feed(a,f);
⏹泛型:
把类型作为参数,类似于C++的模板类
⏹反射:
根据字符串的对象名、方法名得到对象、方法本身
想创建一只abcDog,newabcDog
Animala=Class.newInstance(“abcDog”);
-引用
⏹此处Java与C++有区别
引用是用于保存对象地址
Animala;//Java:
仅声明了一个引用
//C++:
在内存中创建了一个对象
Animal*a;//C++:
相当于声明了一个Java引用
Animala=newDog();//Java创建对象,左边是较抽象的类型,右边是较具体的类型
Catc;
c=newDog();//编译不过
Animala=newDog();
Catc=(Cat)(a);//编译能过,运行不能过
-String
⏹Strings=“abcd”;
⏹Strings=newString(“abcd”);
⏹上面两者是有区别的,区别如下:
◆Strings1=“abcd”;
◆Strings2=“abcd”;
◆Strings3=newString(“abcd”);
◆Strings4=newString(“abcd”);
◆s1和s2内存地址是一样的,但与s3地址不同,s3与s4地址也不同
-WrapperClass:
包装类
⏹Java中每一个基本数据类型对应一个包装类
⏹如int对应Integer,float对应Float
⏹原因:
Java取消了指针,如果没有WrapperClass,无法对基本数据类型的内存地址进行引用
-类基本成员默认值
classA{
intk;
floatf;
}
Aa=newA();
A.kA.f
但方法体内的局部变量一定要赋初值才能使用(C++可以不赋初值)
-static关键字
⏹static修饰类成员和方法
◆static类成员:
该类所对象共享该成员
◆static方法:
不用生成对象实例就可以调用该方法
-操作符
⏹java.lang是核心包,是不需要import由系统自动加载,里面的内容可以在任何程序中直接使用
◆其中定义了Object类,是Java中所有类的最顶层父类,定义一个类不用写继承Object也会自动继承(单根继承结构)
⏹简化输出语句
◆觉得System.out.print太烦了
◆作者开发了一个print(Strings)方法替代它
importstaticnet.mindview.util.Print.*;
请大家在自己的程序上用上上述print语句。
-引用(再次与C++的指针进行对比)
⏹C++:
用new申请的空间是要手工回收(delete)
A*a=newA();
a=newA();
⏹Java:
不用人工参与内存回收,由GC负责回收不再使用的内存空间
⏹方法参数传递的问题
◆例1
C++中,f(Lettery)的含义是把对象y传到f中
Letterx=newLetter();
x.c='a';
f(x);//是否把x传到f中?
不是,是把x的一个副本传到f中,采用CopyConstructor把xcopy一份,CopyConstructor可以自己定义如何复制
Java中,f(Lettery)传的是原来对象的引用x的一个copy
◆例2
voidf(Letterx){
x=newLetter();
x.c=‘k’;
}
Letterx=newLetter();
x.c='a';
f(x);//传到f中的是引用x的copy
输出是’a’
-短路求值
⏹if(a!
=0&&x/a>5)…
⏹++,--:
Java=C++--a+++++a
⏹==和Object.equals()
◆基本类型:
5==6false
◆引用类型比较
●==对引用进行地址的比较
●equals()对包装类,String等对象比较是按值进行
●Object.equals最初的实现是按地址比较,但某些系统内对equals进行了覆盖,使之按所需要的方式(按值)进行比较
⏹int与boolean的转换
◆C++把0看作false,非0正数看作true
◆Java没有这样的自动转换机制
⏹四舍五入
◆例:
求一个数的整数部分和小数部分
doubled=3.14;
inta=(int)d;//整数部分
doubleb=d–a;//小数部分
使用java.Math.round()方法,四舍五入
第四章.流程控制
三种流程:
顺序、分支、循环
Java仍然可以使用goto,但不建议
-foreach的语法
⏹for(floatx:
f)f是数组,可以枚举
⏹String也可以用foreach
⏹数组可以foreach,大部分Java集合类、容器类对象也可以foreach
⏹元素没有组成数组,但又希望使用foreach,可以使用作者提供的range方法
◆Range所体现的是一种Creator的设计模式,把对象创建的细节进行了封装
第5章.初始化与清理
-内存清理很重要
C++中new的对象必须delete
Java中由GC负责不再使用的对象的清理
-构造器Constructor
⏹在对象初始化的时候被调用
⏹Java没有“析构函数”,但提供了finalize等方法允许用户在对象被销毁时做一些动作
⏹构造器必须和类名一样,没有返回值,可以有参数
⏹可以不显式定义构造器,这时系统会自动生成一个默认构造器,没有参数,也没有实现代码。
⏹显式定义构造器是一个好习惯,告诉系统是有关注到对象的初始化的动作
⏹可以有多个构造器,它们的名字一样,参数列表不同(Overload,重载)
⏹构造方法可以加访问控制符吗?
可以。
Private构造方法可以使得外界无法创建该类的对象,是一种创建对象的模式。
-Overloading:
重载,发生在同一个类中
intf(inta,intb);
intf(inta);
intf(floata,intb);
出发点是把人类语言映射到程序设计语言,同一句话在不同的上下文中有不同的含义
f(3,4)f(6)
每一个版本的重载方法都必须有一个独一无二的参数类型列表
当涉及到基本类型的自动类型转换时,比较复杂
传入参数类型精度小于形参,则系统会自动提升
实际参数的精度大于形参,必须通过类型转换执行窄化转换
构造方法也可以重载的
-this引用
⏹一个指向对象自身的引用
⏹在方法调用时this引用的作用
◆在方法调用时,编译器隐含的把当前对象的this引用传到方法中
a.peel
(1);
实际上编译器是按Banana.peel(a,1)生成代码
voidpeel(inti){
print("Whichbanana”:
+this.toString());
}
⏹this可用于调用不同版本的构造方法(重载)
◆有不同参数列表的构造方法,需要在一个构造方法中调用另一个
●不能写构造方法名字,只能用this
●必须写在最开始的位置(前面不能有代码)
⏹static方法与this引用的关系
◆static方法不用生成对象,就可以直接通过类名调用的
◆编译器调用static方法时,不会把对象引用传过去,因此static方法中不能用this引用
◆如果在设计中出现大量的static方法,表明你的设计可能有问题
◆一般把工具方法定义为static方法
T($)
-清理
⏹finalize()方法:
在类中定义,且在对象即将被GC回收之前,由系统自动调用
⏹finalize与C++的析构函数不同,Java中new出来的空间是不用回收的,也没有delete语句
⏹finalize不一定会被执行,有可能永远不执行
⏹finalize的真正作用:
不是回收new出来的空间
◆回收一些非Java代码申请的空间
⏹控制GC的动作
◆System.gc();//迫使GC尽快进行回收工作
◆Book例子
●System.gc()的使用
●finalize里可以写上保持系统一致性的代码
⏹GC的工作原理(自学)
-初始化
⏹成员初始化
◆基本数据类型的局部变量,必须显式初始化
◆类数据成员:
可以不用显式初始化
●可以在定义时显式初始化
●可以调用某个方法进行初始化,即使这个方法定义在变量之后
◆构造器初始化
●初始化顺序
⏹总是先执行自动初始化
⏹与声明的顺序无关(*):
先成员初始化,再构造方法
●类中static成员变量的初始化
⏹只会在类加载的时候被初始化一次
⏹Bowl例子P95
◆StaticInitialization类中有两个static成员,它们在该类的main方法被调用前会初始化,Table:
Bowl1和Bowl2Table构造方法f1;Cupboard:
Bowl4Bowl5Bowl3Cupboard构造方法f1;StaticInitialization.main方法:
再生成一个Cupboard对象:
Bowl3Cupboard构造方法f1…
●static语句块/非static语句块
⏹在类中定义的语句块,用static修饰,仅在类被加载时执行一次
⏹在类中定义的语句块,直接用{}包围,在对象被生成时执行一次
⏹数组初始化
◆数组名是个引用
◆C++中,inta[5];(constint*)int*b;
◆Java中对数组进行了封装,是一个类型
◆数组有.length属性
◆创建数组时可以使用变量作为长度
◆Autoboxing:
自动打包,数组初始化时可以给出基本数据类型或其包装类
◆注意:
main方法是static,可以通过类名.main进行调用
◆可变参数列表
C++的printf:
printf(“%d%d%s”,1,2,”fdafd”)
适用于参数个数和类型都未知的场合
●自动类型转换
●可以传入空列表
●可变参数列表与重载结合
⏹枚举类型:
Java的枚举类型真的是类型,可以用于switch语句
-Java中以包作为源代码的组织方式:
具有不同功能的源代码文件要放在不同的包中
⏹包名:
gdut.auto.ne.javaoo.c1003.sn312323.lab1
gdut.auto.ne.javaoo.c1003.Tools
⏹每个单词要以字母打头
⏹尽量用一些有意义的单词
⏹包的层次结构和磁盘目录结构对应
-访问权限
⏹关键字:
private,protected,public,默认(同一个包可以访问)
◆把尽可能多的细节都定义为private
⏹两个工具类的实现
◆Range
⏹类的访问权限
◆每个文件只能有一个public类,且该类的类名要和文件名一样
◆文件中可以没有public类,不用运行,只提供服务,可以任意命名文件名
◆构造方法可以用private修饰,导致外界无法通过new获取该类的对象
●产生一种创建对象的模式
⏹private构造方法
⏹有一个static方法返回对象给外界
●单实例类(Singleton)创建对象的设计模式
-复用类
⏹复用并不等于代码复制(低水平)
⏹Java提供三种复用类的方法
◆组合
●把一些现成的子对象,组合起来构成一个大的对象
●SprinklerSystem:
WaterSource对象对外界是透明的
●在组合关系下,大对象中包含了很多小对象的引用,对这些引用进行初始化有几个时机:
4个
◆继承
●语法:
extends关键字
●classSonextendsFather
●Java不允许多重继承,extends后只能跟一个类;但Java允许一个类实现多个接口
●继承的例子
●可以为每一个类创建一个main方法,把一些测试的代码写在其中;只有主类的main方法会在程序运行时被执行
●测试框架:
JUnit
●继承树上的构造方法的调用顺序:
先调用父类的构造方法,再调用子类的构造方法
⏹例子:
Cartoon
⏹例子:
Chess
◆代理(Proxy)
●是继承和组合的中庸之道
●以组合的方式重用对象,但暴露对象的所有方法
●Java不直接支持代理(必须自己写代码暴露被代理对象的方法)
●可以解决不适合继承的情况
●例子:
SpaceShip
继承:
classSpaceShipextendSpaceShipControl
SpaceShip.up();
SpaceShip.forward();
该概念层次不符合人的自然理解
组合
SpaceShipControl是SpaceShip的一部分,人控制SpaceShip,代理是合适的
代理的问题:
如果要暴露所有的操作,需要编写很多的代码;这种代理方式缺乏灵活性,在编码时就必须HardCode这种代理关系(在一些成熟的框架产品中大量使用类似技术)
⏹结合使用组合和继承
◆一个很优雅的例子:
PlaceSetting,各个类之间的耦合度很低,代码的可重用性很高
◆在有父类和子类的情况下,进行正确的清理
●除了内存清理以外,其它清理工作都要手工完成,要注意调用父类的清理方法
⏹需要显式调用父类的清理方法
⏹如super.dispose()
⏹try…finally语句块:
Java中的异常处理
◆名称屏蔽
●Java:
基类和子类方法的重载可以同时使用(C++不行)
-如何选择组合与继承
⏹组合:
在新类中使用现有类的功能而非它的接口,has-a,尽可能不要定义public的对象用于组合
⏹继承:
在某个现成类的基础上开发它的一个特殊的版本,新的类is-a旧类
-向上转型:
把派生类转换为基类引用
⏹继承最重要的作用:
表现新类和基类之间的关系
-final关键字
⏹final变量:
赋了初值之后不能再被修改
◆必须在final成员变量的定义或构造方法中对其赋初值
◆定义时不赋初值的final变量称为空白final
◆staticfinal变量的书写规则:
全大写,用下划线分开每个单词
staticfinalstringNAME_OF_DOG=“Tom”
◆final变量可以在运行时赋值,其初值在编译期间不一定要知道。
C++允许这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程 笔记