java周总结.docx
《java周总结.docx》由会员分享,可在线阅读,更多相关《java周总结.docx(20页珍藏版)》请在冰点文库上搜索。
java周总结
java周总结
JAVA的面向对象编程--------课堂笔记
面向对象主要针对面向过程。
面向过程的基本单元是函数。
什么是对象:
EVERYTHINGISOBJECT
所有的事物都有两个方面:
有什么:
用来描述对象。
能够做什么:
告诉外界对象有那些功能。
后者以前者为基础。
大的对象的属性也可以是一个对象。
为什么要使用面向对象:
首先,面向对象符合人类看待事物的一般规律。
对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。
方法的定义非常重要。
方法有参数,也可能有返回值。
注意区分:
对象、对象的实现者、对象的调用者。
分析对象主要从方法开始。
我们通过类来看待对象,类是对象的抽象。
其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。
对象之间的耦合性一定要低。
这样才能使每个对象本身做成最好的。
对于对象的要求:
高内聚、低耦合,这样容易拼装成为一个系统。
实现高内聚就是要最大限度低提高复用性。
可复用性是OOP的基础。
比较面向过程的思想和面向对象的思想:
面向过程的思想:
由过程、步骤、函数组成,以过程为核心;
面向对象的思想:
以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。
面向过程是先有算法,后有数据结构。
面向对象是先有数据结构,然后再有算法。
在用面向对象思想开发的过程中,可以复用对象就进行复用,如无法进行复用则开发新的对象。
开发过程是用对个简单的对象的多个简单的方法,来实现复杂的功能。
从语法上来看,一个类是一个新的数据类型。
在面向对象编程中,除了简单数据类型,就是对象类型。
定义类的格式:
classStudent{
代码
}
注意类名中单词的首字母大写。
局部变量:
定义在方法之中的变量。
局部变量要先赋值,再进行运算,而实例变量均已经赋初值。
这是局部变量和实例变量的一大区别。
实例变量的对象赋值为null。
局部变量不允许范围内定义两个同名变量。
实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。
实例变量和局部变量允许命名冲突。
书写方法的格式:
修饰符返回值方法名调用过程中方法体
可能出现的例外
publicint/voidaddNumberthrowExcepion{}
例:
publicintaddNumber{
}
注:
方法名中的参数inta,intb为局部变量
类方法中的一类特殊方法:
构造方法。
构造方法是当用类生成对象时,系统在生成对象的过程中利用的方法。
注意:
构造方法在生成对象的时候会被调用,但并不是构造方法生成了对象。
构造方法没有返回值。
格式为:
public方法名。
构造方法的方法名与类名相同。
构造方法是在对象生成的过程中自动调用,不可能利用指令去调用。
在一个对象的生成周期中构造方法只用一次,一旦这个对象生成,那么这个构造方法失效。
用类来生成对象的语句:
Students=newStudent。
第一个Student表示这是用Student类进行定义。
“Student”表示调用一个无参数的构造方法。
如果中有参数,则系统构造对象的过程中调用有参的方法。
此时S称为一个对象变量。
Students的存储区域存放的是地址:
一个对象在硬盘上占有一个连续地址,首地址赋予s空间。
S称为对象Student的引用。
注意:
在对象变量中存放的是引用;在简单变量中存放的是数值。
可以构造多个构造方法,但多个构造方法的参数表一定不同,参数顺序不同即属于不同的构造方法:
publicstudent{
}
publicstudent{
}
为两个不同的构造方法。
如果我们未给系统提供一个构造方法,那么系统会自动提供一个为空的构造方法。
练习:
写一个类,定义一个对象,定义两个构造方法:
一个有参,一个无参。
注意下面这种形式:
staticvoidchangename{“LUCY”}
注意生成新的对象与旧对象指向无关,生成新对象生命消亡与旧对象无关。
面向对象方法的重载和覆盖。
Overloading返回值也可能相同。
在程序的编译过程中根据变量类型来找相应的方法。
因此也有人认为overloading是编译时的多态,以后我们还会学到运行时多态。
为什么会存在overloading技术呢?
作为应对方法的细节。
利用类型的差异来影响对方法的调用。
吃可以分为吃肉,吃菜,吃药,在一个类中可以定义多个吃方法。
构造方法也可以实现overloading。
例:
publicvoidteach{};
publicvoidteach{};
publicvoidteach{}为三种不同的方法。
Overloading方法是从低向高转。
Byte—short—float—int—long—double。
在构造方法中,this表示本类的其他构造方法:
student{};
student{
this;//表示调用student
}
如果调用student则为this。
特别注意:
用this调用其他构造方法时,this必须为第一条语句,然后才是其他语句。
This表示当前对象。
PublicvoidprintNum{
Intnumber=40;
;
}
此时打印的是实例变量,而非局部变量,即定义在类中而非方法中的变量。
表示实例变量。
谁调用那么谁即为当前对象的number方法。
封装:
使对象的属性尽可能私有,对象的方法尽可能的公开。
用private表示此成员属性为该类的私有属性。
Public表示该属性公开;
Private表示该属性为只有本类内部可以访问。
如果没有特殊情况,属性一定私有,方法该公开的公开。
如果不指明谁调用方法,则默认为this。
区分实例变量和局部变量时一定要写this。
父类和子类。
父类的非私有化属性和方法可以默认继承到子类。
ClassSonextendsFather{
}
而如果父类中的私有方法被子类调用的话,则编译报错。
父类的构造方法子类不可以继承,更不存在覆盖的问题。
如果子类访问父类的构造方法,则在编译的时候提示访问不到该方法。
JAVA中不允许多继承,一个类有且只有一个父类。
JAVA的数据结构为树型结构,而非网状。
方法的覆盖
方法的重载并不一定是在一个类中:
子类可以从父类继承一个方法,也可以定义一个同名异参的方法,也称为overloading。
当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。
如果方法不同,则成重载。
对于方法的修饰词,子类方法要比父类的方法范围更加的宽泛。
父类为public,那么子类为private则出现错误。
之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。
以下范围依次由严到宽:
private:
本类访问;
default:
表示默认,不仅本类访问,而且是同包可见。
Protected:
同包可见+不同包的子类可见
Public:
表示所有的地方均可见。
当构造一个对象的时候,系统先构造父类对象,再构造子类对象。
构造一个对象的顺序:
①递归地构造父类对象;
②顺序地调用本类成员属性赋初值语句;
③本类的构造方法。
Super表示调用父类的构造方法。
Super也和this一样必须放在第一行。
This用于调用本类的构造方法。
如果没有定义构造方法,那么就会调用父类的无参构造方法,即super。
要养成良好的编程习惯:
就是要加上默认的父类无参的构造方法。
思考:
可是如果我们没有定义无参的构造方法,而在程序中构造了有参的构造方法,那么如果方法中没有参数,那么系统还会调用有参的构造方法么?
应该不会。
多态:
多态指的是编译时类型变化,而运行时类型不变。
多态分两种:
①编译时多态:
编译时动态重载;
②运行时多态:
指一个对象可以具有多个类型。
对象是客观的,人对对象的认识是主观的。
Animala=newDog;查看格式名称;
Dogd=a。
声明父类来引用子类。
运行时多态的三原则:
1、对象不变;
2、对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。
在上面的例子中:
Animala=newDog;对象a的编译时类型为Animal,运行时类型为dog。
注意:
编译时类型一定要为运行时类型的父类。
对于语句:
Dogd=a。
将d强制声明为a类型,此时d为Dog,此时d就可以调用运行时类型。
注意:
a和d指向同一对象。
3、在程序的运行时,动态类型判定。
运行时调用运行时类型,即它调用覆盖后的方法。
关系运算符:
instanceof
ainstanceofAnimal;
a为对象变量,Animal是类名。
上面语句是判定a是否可以贴Animal标签。
如果可以贴则返回true,否则返回false。
在上面的题目中:
ainstanceofAnimal返回True,
ainstanceofDog也返回True,
instanceof用于判定是否将前面的对象变量赋值后边的类名。
Instanceof一般用于在强制类型转换之前判定变量是否可以强制转换。
如果Animala=newAnimal;
Dogd=Doga;
此时编译无误,但运行则会报错。
Animala=newDog相当于下面语句的功能:
Animala=getAnimal;
Publicstatic;
ReturnnewDog;
封装、继承、多态为面向对象的三大基石。
运行时的动态类型判定针对的是方法。
运行程序访问的属性仍为编译时属性。
Overloading针对的是编译时类型,不存在运行时的多态。
习题:
建立一个shape类,有circle和rect子类。
Shape类有zhouchang和area两种方法。
squ为rect子类,rect有cha用于比较长宽的差。
覆盖时考虑子类的private及父类的public,之所以这样是避免调用A时出现实际调用B的情况。
而出现错误。
下午讲的是教程上的Module6
Module6-7包括:
面向对象高级、内部类、集合、反射、例外。
面向对象高级、集合和例外都是面向对象的核心内容。
Java总结
--开始于2016-9-709:
27:
48
▉Java概述
Java分类:
javaSE:
主要是桌面程序、控制台程序开发,是java基础
javaEE:
企业级开发
javaME:
嵌入式开发
第一个Java程序:
publicclassJavaTest{
privateStringstr=newString;publicvoidshowMessage{}
JavaTesttest=newJavaTest;
;;publicstaticvoidmain{
}
}
Java可以有多个main函数。
每个类中都可以有main函数,也就是说你的代码可以有多个入口,你只需要明白什么时候用哪个类的main函数作为入口即可。
但是要注意的是用不同入口启动的两个进程是毫不相关的。
学习Java前的心理准备:
java他妈的把c/c++剔除的够干净的,在c/c++中易如反掌的事,在java中却要大动干戈。
所以在学习java之前,请做好心理准备,java其实是一个残疾人。
▉Java关键字、运算符
Java保留字一览表:
java中goto是保留字,但不是关键字,请记住java中没有goto,但可以实现类似的功能,参考XX。
java中没有sizeof,因为java认为c语言中的sizeof主要用于跨平台,而java本身就是跨平台的。
java中没有unsigned,也就是说java中的基本数据类型都是有符号的。
这点要注意一下。
请注意下面的代码:
inta=…;
intb=…;
intc=a–b;
以上代码只有在a和b都是无符号的int时才能正确工作。
对于java这种没有unsigned类型的语言来说,上述代码就是一个编程错误!
因为int不足以容纳两个有符号int的差,当a是很大的正整数,b是很大的负整数时,a-b就会溢出并返回负值。
Java运算符:
java运算符和c、c++的运算符类似,功能也类似。
但也有不同,比如java中有无符号右移运算:
>>>。
同时注意:
用于String的―+‖和―+=‖是java中仅有的两个重载过的运算符,java不允许程序猿重载任何的运算符。
▉Java数据类型
Java是强数据类型的语言,java基本数据类型:
boolean:
trueorfalse
char:
16bits,Unicode编码字符
byte:
8bits
short:
16bits
int:
32bits
long:
64bits
float:
32bits,floatvar=,注意加上“f”,否则带小数点的值都会被java当作double处理。
double:
64bits
在Java中,主数据类型都有对应的被包装过了的类,以第一个字母大写开头,例如:
Boolean、Integer、Character、Byte、Short、Long、Float、Double。
主数据类型可以与其对应的对象相互转化,在运算时,Java以后会自动进行转换,所以很方便。
在使用ArrayList时,你只能声明对象,例如:
ArrayList,而不能使用ArrayList,但是在使用ArrayList时,可以直接使用int类型。
Java字节序:
java在任何系统上的字节序都是大端,因为java是跨平台的嘛。
网络传输的字节序也是大端。
因此java程序和java程序之间进行数据传输,并不会出现什么问题。
但是当java遇到字节序是小端的数据时,就会出现问题。
这时我们就需要转换数据的大小端。
方法有很多,你可以自己写方法实现大小端的检测和转换,但是作为java程序猿来说,我们应该尽量使用已有的类库或者方法来解决问题,以提高生产率。
下面介绍几种java类库中已有的解决办法:
①使用类中的order方法将字节序改为小端。
如:
;
②使用Integer等基本数据类型对应的类类型中的静态方法将int等数据类型的数据转
换为小端字节序的数据。
如:
;
另外,在网络传输时,还需要注意其他问题:
java没有unsigned;java数据类型的长度和其他语言的可能不同。
同时,IEEE754标准只是规范了float、double的逻辑规范,其存储时还是会有字节序问题,因此在不同系统或者编程语言之间进行传输数据时,也要考虑字节序问题。
byte、int的转换:
由于java中所有的基本数据类型都是有符号的,所以当你要把byte类型的数据当作无符号数据看待时,你就得使用特殊的方法将其存放在更大容量的数据类型里边,比如将byte转换之后存放在int中。
下面说下byte和int的相互转化:
byte转换为int有两种方法:
①不改变原值,也即转换前后都将其看作有符号数,可使用强制类型转换:
inti=b;②保留最低字节的个个位不变,则需采用位操作:
inti=b&0xff;
int转换为byte可以直接使用强制类型转换:
byteb=i;,注意这个操作是直接截取int中最低一个字节,如果int数值大于127且小于256,则转换得到的byte为负值,如果int数值大于255,则转换得到的byte就会面目全非,因为截断了。
▉字符串
String:
String是不可变字符串对象,任何修改String的操作,实际上返回的都是一个全新的String对象。
String中保存的是Unicode格式的16位字符组成的字符串,String永远是Unicode编码。
―+‖、―+=‖可以用来连接字符串。
由于String是不可变的,因此在连续的字符串连接时,会不断的生成中间的String对象,以得到最终的String对象。
这样的话,效率是很低的,java编译器为了提高效率,会暗地里为我们做一些优化,它用StringBuilder来处理中间过程的字符串连接,并最终使用toString方法将最终结果转换为String对象。
在程序中,比如在循环连接字符串时,为了效率,最好使用StringBuilder来处理中间结果。
StringBuilder是可变的,类似的还有StringBuffer,不过StringBuffer是线程安全的,因此开销相对也会大点。
byte、char、String的转化:
取得其“GBK”编码格式的字节数组,“GBK”指出将字符串转换为何种编码并保存到字节数组,取得的字节数组的内容就是该字符串在“GBK”编码下的字节数组。
将String转为char[]。
newString,将bytes字节数组以“UTF-8”编码格式转换为Unicode,“UTF-8”指出字节数组是以什么格式编码的,并不是最终要转换成的编码。
newString将char类型的数组chars转换为String类型。
▉数字的格式化
Java中数字的格式化与C语言的很相似。
将数字以带逗号的形式格式化:
;注意:
%和d之间有一个逗号。
Java中日期的格式化:
);其中,%tc表示完整日期,%tr只显示时间,%tA%tB%td周月日
也可以这样写:
Stringtime=new);取得当前日期可以使用Date对象,Date中getTime、setTime都是针对GMT时间,toString则会根据时区将时间转换为相应字符串,但其他关于日期的操作最好使用Calendar对象,具体参见Java手册。
▉Java控制语句
java中控制语句与c、c++类似,但与C/C++不同的是,java中的while、if等的条件判断,不能直接使用类似于int型的变量来判断,应该用一个判断语句或者直接使用boolean类型的变量。
特殊循环语句:
循环for{}中,冒号代表in,cells为数组,每循环一次cells数组的下一个元素都会赋值给cell变量。
这是java开始使用的for循环加强版,当然你也可以使用for原版:
for{}
foreach循环可以用于数组和任何实现了Iterable接口的类。
▉类和对象
java中的所有东西都包含在类中,在java源文件中可以包括多个类,但是只能有一个public类,而且如果有public类的话,这个文件的名字要和这个类的名字一样。
一个类中可以有多个方法,一个方法中可以有多个语句。
Java存取权限和存取修饰符:
Java有4种存取权限和3种存取修饰符,因为有一个缺省的权限等级。
4种存取权限:
public:
...
private:
...
default:
只有在同一个包中的默认事物能够存取
protected:
受保护的部分,运行起来像是default,但也允许不在同一个包中子类继承受保护的部分
3种存取修饰符:
public、private、protected
对象与引用:
java中没有所谓的对象变量,有的只是对象的引用,对象只存在于堆上,并且只能通过其引用进行引用。
java创建对象不能通过类似于“Aa;”的形式直接定义,这只是定义了一个对象引用变量,而需要通过类似于“Aa=newA;”的形式在堆上定义一个对象,并将在栈上的对象的
引用指向这个对象。
c++中对象作为参数,是按照值传递。
其实java也是值传递,只不过java中只有对象的引用,而没有所谓的“对象变量”,故而传递的都是对象的引用的值,因此在函数中可以改变引用参数指向的对象。
注:
java中String类型的对象作为函数参数传递时,也是传递引用的值,而不是所谓的“值传递”,因为String类是不可变的,它没有提供自身修改的函数,每次修改操作都是新生成一个String对象,所以要特殊对待,可以认为是传值。
关于这一点,网上实在是有太多的流言蜚语,有很多流言是错误的,请务必注意。
那么有没有办法使函数不能够修改引用参数指向的对象呢?
答案是传递对象副本的引用。
为了使用对象的副本作为函数参数,可以使用对象的clone方法对其进行浅层复制,所谓的浅层复制即是只复制对象本身,而不对其引用的或者其成员变量引用的对象进行复制,也即不对整个对象网进行复制。
对对象网进行复制,另有它法,请XX之。
对象相等性的判断:
“==”或者“!
=”只能用来判断对象的引用是否相等,若需判断对象是否相等,则需equals,但一般你需要覆盖equals,因为Object中的equals默认使用对象的地址判断对象是否相等。
但基本类型直接使用“==”或者“!
=”即可。
实例变量与局部变量:
实例变量是声明在类内,而不是方法中,实例变量有默认值。
局部变量是声明在方法中的,局部变量没有默认值,在使用之前,必须初始化,否则编译器报错。
关于初始化的更多细节:
java中成员变量可以在定义的后边直接进行初始化,也可以在构造函数中进行初始化。
而c++中成员变量不能在定义类时直接初始化,需通过构造函数初始化。
final:
声明一个类或方法到达继承树的末尾,可以用final,也即禁止该类被继承或方法被覆盖。
同时请注意final方法是前期绑定的,将方法声明为final可以有效关闭该方法的动态绑定机制,但多数情况下并不会提升多少效率,因此不要为了提升效率而随意使用final来声明方法。
静态的方法:
用static声明的方法是静态的方法,静态方法不需要实例化的对象,就可以通过类名来引用,但静态的方法不可以使用非静态的变量,也不能调用非静态的方法。