java入门笔记Word格式.docx
《java入门笔记Word格式.docx》由会员分享,可在线阅读,更多相关《java入门笔记Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
要调用对象中的属性和方法使用“.”操作符。
this关键字:
是用来指向当前对象或类实例的,作用:
(1)点取成员:
就是在编写类的时候,通过使用this来点取类的属性。
(2)区分同名变量:
如果使用this就表示调用属性,否则就调用方法内部变量。
(3)作为方法名来初始化对象。
初始化一个类必须先初始化它的属性。
实例变量能够自动初始化,局部变量必须在使用之前“手工”初始化。
封装的功能:
隐藏对象的实现细节迫使哟暴发户去使用一个界面访问数据,所谓界面就像是房间的门一样,你应该通过门进入房间是代码更好维护。
继承可以使得子对象具有负累的各种属性和方法,而不需要再次编写相同的代码,当然在令子对象继承父对象的同时么可以重新定义某些属性,并重写某些方法,既覆盖父对象的原有属性的方法,使其获得与父对象不同的功能。
在java中is-a是用来描述继承关系的。
在java中has-a是用来描述对象组合关系的。
多态:
同一行为的多种不同表达,或者同一行为的多种不同实现。
继承的时候和实现接口的时候会出现多态。
引用类型是指向一个对象而不是原始值的类型,指向对象的变量是引用变量。
在java中凡是用new创建的对象都是引用对象。
Stringa=“11111”;
Stringa=newstring(“11111”);
按值传递:
值得是在方法调用时,传递的参数是按值的拷贝传递。
按值传递的重要特点:
传递的是值的拷贝,也就是说传递后就互不相关啦。
基本类型和string类型全部都是按值传递的。
(你变你的,我变我的,没有关系)
按引用传递:
是在调用方法时,传递的参数是按引用进行传递,其实传递的引用地址,也就是变量所对应的内存空间的地址。
按引用传递的重要特点:
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)
“在java里面参数传递都是按值传递”这句话的意思是:
按值传递是传递的值的拷贝,按引用传递的其实传递的是引用的地址值,所以统称按值传递。
在java里面只有基本类型和string类型是按值传递,其他的都是按引用传递,原因很简单,因为string有一个特点:
“string的值不可改变”。
在JDK中针对各种基本数据类型分别定义相应的引用类型,称这些类型为包装类。
(基本类型类的表达)
每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其他一些有用的功能。
包装类一经创建,其内容(所封装的基本类型数据值)不可改变。
自动包装:
就是把基础数据类型自动封装并转换成对应的包装类的对象。
自动解包:
就是把包装类的对象自动解包并转换成对应的基础数据类型。
强制类型转换只能用在原本就是某个类型,但是被表示成了另外一种类型的时候,可以把它强制转换回来,强制转换并不能再任意的类型间进行转换。
在四则运算表达式中:
byteshortchar都会自动升级成为int进行运算。
在四则运算表达式中,如果不强制进行类型的转换,俺么运算最后的结果就是精度最高的那个操作数决定的。
继承后的基本运行顺序:
规则:
初始化子类必先初始化父类。
(初始化一个类必先初始化属性)
单继承性:
当一个类从一个唯一的类继承时,被称作单继承性,单继承性使代码更可靠。
Java类的继承只能是单继承。
构造方法与私有属性和方法都不能被继承。
关键字super可被用来引用该类的父类,它被用来引用父类的成员变量或方法。
(与this对比,this自己引用自己)
super关键字的作用:
点取父类中被子类隐藏的数据成员。
点取已经覆盖了的方法。
作为方法名表示父类构造方法。
调用父类构造方法,在许多情况下,使用默认构造方法来对父类对象进行初始化,当然一额可以使用super来显示调用父类的构造方法。
(this或者super如果要调构造方法,如果要写的话,一定要写在构造方法内部的第一行)
方法的覆盖:
在父子类中,如果某个方法的名称,返回类型及参数列表正好与父类中的某个方法完全一样,那么这个方法就是覆盖方法,子类覆盖了父类的方法。
编译的时候看数据类型,运行时看实际的对象类型(new操作符后跟的构造方法是哪个类的),一句话,new谁就是调用谁的方法。
覆盖方法的规则:
覆盖方法的返回类型,方法名称,参数列表必须与它所覆盖的方法相同。
覆盖方法不能比它所覆盖的方法访问性差(即访问权限只可以扩大不允许缩小)
覆盖方法不能比它所覆盖的方法抛出更多的异常。
覆盖多出现在父子类
重载:
在同一个java类中(包含父类),如果出现了方法的名称相同,而参数列表不同的情况就叫做重载,参数列表不同的情况包括:
个数不同,类型不同,顺序不同等,特别提示,仅仅参数变量名称不同是不可以的。
注意:
跟成员方法一样,构造方法也可以重载。
(根据参数列表判断调的是谁)
方法重载的规则:
方法名称必须相同
参数列表必须不同(个数不同或类型不同,或参数排列顺序不同)
方法的返回类型可以相同也可以不同
调用语句的参数表必须有足够的不同,以至于允许区分出正确的方法被调用,正常的拓展晋升(如,单精度类型float到双精度类型double),可能被应用,但是这样会导致在某些条件下的混淆。
final的方法可以重载。
重载多出现在一个类中。
一个对象只有一个格式(是在构造时给它的),但是,既然变量能指向不同格式的对象,那么变量就是多态性的,也就是说一个对象之哟一种形式,但一个变量却有多种不同的形式。
instanceof用来判断某个变量是否属于某种类的类型。
多态的类型转换,子类向父类转时可以的。
绑定:
将一个方法的调用同一个方法的主题连接到一起就称为“绑定”。
(运行时刻才连接就叫动态绑定,java中绑定的方法都是采用动态绑定,除非一个方法被声明为final)
static修饰符:
能够与属性、方法、和内部类一起使用。
表示是“静态”的。
(静态不用new一个实例就可以调用)
类中的静态变量和静态方法能够与“类名”一起使用,不需要创建一个类的对象来访问该类的静态成员。
一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些实例中的这个static变量会共享同一个内存空间。
static的变量是在类装载的时候就会被初始化,也就是说,只要类被装载,不管你是否使用了static变量,它都会被初始化。
(被初始化一回,类只会被装载一回)
static的基本规则:
1、一个类的静态方法只能访问静态属性()
2、一个静态方法不能直接调用非静态方法
3、如果访问控制权限允许,static属性和方法可以使用对象名加“.”方式调用;
当然也可以是有实例加“.”方式调用。
4、静态方法中不存在当前对象,因而不能使用“this”,当然也不能使用“super”。
5、静态方法不能被非静态方法覆盖
6、构造方法不允许声明为static
非静态变量只限于实例,并只能通过实例引用被访问。
final所标记的成分基于“终态”的特征,最终的。
(类,属性变量,本地变量)
final的具体规则:
1、final标记的类不能被继承
2、final标记的方法不能被子类重写
3、final标记的变量(成员变量或局部变量)即成为变量,只能赋值一次
4、final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
5、final标记的局部变量可以只声明不赋值,让再进行一次性的赋值(参数列表也算局部变量)(static不能用在局部变量里面)
6、final一般用于笔记那些通用的功能,实现方式或取值不能随意被改变的成分,以避免被误用。
finalstrings;
S=“111”;
System.out.println(“s==”+s);
Java程序运行时的内存结构分成:
方法区,栈内存,堆内存,本地方法栈
方法区存放装载的类数据信息包括:
(1)基本信息
1、每个类的权限定名(带包结构的)
2、每个类的直接超类的权限定名
3、该类是类还是借口
4、该类型的访问修饰符
5、直接超类借口的权限定名的有序列表
(2)每个已装载类的详细信息
1、运行时的常量池
2、字段信息
3、方法信息
4、静态变量
5、到类classloder的引用
6、到类的引用
主要放的,把类分类全部放在方法区
栈内存:
以帧的形式存放本地方法的调用状态,包括方法调用的参数,局部变量,中间结果(已经运行起来的)(虚拟机的垃圾回收器不管)
栈有一个很重要的特性,就是存在栈中的数据可以共享。
堆内存:
存放有new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动回收器来管理。
本地方法的栈内存:
java通过java本地借口JNI来调用其他语言编写的程序,在java里面用native修饰符来描述一个方法的本地方法。
String的内存分配:
Stringstr=newString(“abc”);
Stringstr=“abc”;
String类的值是不可改变的。
(按值传递)
数组:
数组是由相同类型的若干项数据组成的一个数据集合,也就是说用来集合相同类型的对象并通过一个名称来引用这个集合,数组时引用类型。
可以声明任何类型的数组——原始类型或类类型
声明不能创建对象本身,而创建的是一个引用,该引用可被用来引用数组
1、声明不指出数组的实际大小
2、当数组声明的方括号在左边时,该方括号可应用于所有位于其右的变量
数组的创建
使用new关键字来创建一个数组,创建的时候要指明数组的长度inta[]=newint[2];
数组的下表称为数组的索引,必须是整数或者整数的表达式。
数组一旦被创建,在内存里面占用连续的内存地址。
数组还具有一个非常重要的特性——数组的静态性:
数组一旦被创建,不能更改数组长度。
当创建一个数组时,每个元素都被自动使用默认值进行初始化。
如果是本类型就按照每种类型默认的值进行初始化;
而引用类型初始化成null。
数组的初始化就是对数组里面的每一个元素进行赋值。
取值与赋值:
取值摆在左边,赋值摆在右边。
多维数组:
newint[][4]是非法的。
newint[4][]就对啦。
多维数组的本质就是一维数组N-1维数组。
数组一旦创建后,其大小不可调整。
数组的复制:
五个参数(API)
排序:
冒泡排序基本思路:
对未排序的各元素从头到尾以此比较相邻的另个元素是否逆序(与欲排序的程序相反),若逆序就交换这两个元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的非法把剩余的元素逐个比较,就得到了你需要的序列。
for(inti=0;
i<
a.length;
i++){
for(intj=i+1;
j<
a.length;
j++){
if(a[i]>
a[j]){
Inttemp=a[j];
a[j]=a[i];
a[i]=temp;
选择排序基本思路:
从所有元素中选择一个最小元素a[i]放在a[0](即让最小元素a[i]与a[0]交换),作为第一轮;
第二轮是从a[1]开始到最好的各个元素中选择一个最小元素,放在a[1]中……一次类推。
N个数要进行n-1论,比较的次数和冒泡法一样多,但是在每一轮中只进行一次交换,比冒泡法的交换次数少,相对于冒泡法效率高。
inttemp;
for(inti=0;
intlowIndex=i;
for(intj=i+1;
if(a[j]<
a[lowIndex]){
lowIndex=j;
temp=a[i];
a[i]=a[lowIndex];
a[lowIndex]=temp;
插入法排序基本思路:
每拿到一个元素,都要将这个元素与所有它之前的元素便利一遍,让符合排序顺序的元素挨个移动到当前范围内它最应该出现的位置。
inttemp;
for(inti=1;
for(intj=I;
(j>
0)&
&
(a[j]<
a[j-1]);
j--){
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
事实上,数组的排序不用那么麻烦,在java.util.Arrays类中有一个静态方法sort,可以用这个类的sort方法来对数组进行排序(现在的sort方法时升序的)
枚举类型:
enum是一种新的类型(参数传递时按值传递),在JDK5.0加入,允许用常量来表示特定的数据片段,这些数据时分配时预先定义的值的集合,而且全部都以类型安全的形式来表示。
(简单点说就是常量的集合)
values()方法返回了一个由独立的StudentGrade实例构成的数组。
valueof(string):
功能是以字符串的形式返回某一个具体元素的值。
常见类的使用:
Object类简介:
是所有java类的根父类(单根性),任何java对象,如果没有父类,就默认它为继承了object类,因此,实际上,以前的定义是下面的简略:
PublicclassEmployeeextendsObject
Object类定义的equals方法用于判断某个指定的对象与当前的对象(调用equals方法的对象)是否等价,数据等价的基本含义是指两个数据的值相等。
publicBooleanaquals(Objectobj){
return(this==obj);
equals方法与“==”运算符的关系
1、equals()方法只能比较引用类型,“==”可以比较引用类型及基本类型
2、默认的equals()方法比较的是内存地址,基本等同于“==”,但对于类File,String,Data()及包装来说,是比较的是值而不是内存地址
3、“==”进行比较的时候,引用比较数据类型比较的是引用,即内存地址,基本数据类型比较的是值。
(覆盖钱equals和==比较的都是内存地址,覆盖后equals比较的是值,==比较的是内存地址)
控制台输入:
importjava.util.regex.*;
importjava.util.*;
importjava.text.*;
importjava.io.*;
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
Strings="
"
;
InputStreamReaderin=newInputStreamReader(System.in);
BufferedReaderbin=newBufferedReader(in);
try{
s=bin.readLine();
while(s!
=null){
System.out.println("
s==="
+s);
s=bin.readLine();
}
}catch(Exceptionerr){}
finally{
try{
in.close();
bin.close();
}catch(Exceptionerr){
}
第六章内容没有详细看:
主要介绍了一些类的使用。
有math类,日期操作类System类等,以后用到回看。
抽象类和接口:
抽象类:
只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达式上就是没有“{}”
抽象类如何表达:
使用abstract修饰符来表达抽象。
Abstract修饰符可以与类和方法一起使用,被修饰的类不能实例化,被修饰的方法必须包含此方法的类的子类中被实现。
抽象类简单的说:
使用abstract修饰的类就是抽象类。
有抽象方法的类一定是抽象类。
抽象类一定有抽象方法是错误的。
凡是用abstract修饰的类就是抽象类。
抽象类不能直接使用,必须用子类去实现抽象类,然后使用其子类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例,也就是可以使用抽象类来充当形参,实际实现类作为实参,也就是多态的应用。
(必须写一个类去继承抽象类,并实现抽象类中的抽象方法,使用抽象类实际就是使用它的实现类)
不能有抽象构造方法或抽象静态类,abstract类的子类为他们父类中的所有抽象方法提供实现,否则它们也是抽象类。
接口:
java可以创建一种称作接口的类,在这个类中,所有的成员方法都是抽象的,也就是说他们都只有定义而没有具体实现的类,接口是抽象方法和常量值的集合,从本质上说,接口是一种特殊的抽象类,这种类中只包括常量和方法的定义,而没有变量和方法的实现。
接口的语法格式:
访问修饰符修饰符interface接口名称{
抽象属性集
抽象方法集
1、接口中声明的属性默认认为,也只能是publicstaticfinal的,因此在常量声明可以省略这些修饰符
2、接口中只能定义抽象方法,这些方法默认为publicabstract的,也只能是publicabstract的,因而在声明时可以省略这些修饰符
3、和继承抽象父类类似,java类可以实现接口
接口不能直接使用,需要让java类实行接口,然后使用其实现类,必须重写(实现)全部抽象方法,否则只能声明为抽象类
接口不能直接使用new关键字来构建实例
Interfacea=newInterfaceA();
是错误的
接口在使用的时候要实例化相应的实现类
Interfacea=newImplenmentsA();
一个类可以有多个接口,但是public的只有一个。
接口之间可以继承,可以多继承,一个接口可以继承多个接口,但是类是单继承。
Java中级教程:
集合是对象,集合是包含多个对象的简单对象,所包含的对象称为元素。
集合里面可以包含任意多个对象,数量可以变化;
同时对对象的类型也没有限制,也就是说集合里面的所有对象的类型可以相同,也可以不同(同数组,数组定长的)
集合的特点:
数量不限,类型不限
“集合框架”由一组用来操作对象的借口组成,不同借口描述不同的类型的组
集合框架中各接口的特点:
1、collection接口是一组允许重的对象
2、set接口继承collection,无需但不允许重复
3、list接口继承collection,有序但允许重复,并引入位置下标
4、Map接口即不继承set也不继承collection,是键值对
Collection接口
用于表示任何对象或元素组,想要尽可能以常规方式处理一组元素名酒使用这一接口。
Iterator接口:
主要用来枚举集合中的类型
GUI:
图形用户接口,即人机交互图形化用户界面,就是屏幕产品的视觉体验和互动操作部。
分
AWT抽象窗口工具,包括了丰富的图形,用户界面组件和布局管理器的支持,还有对外界事件的处理机制。
Component:
具有图形界面,并能完成一定功能的封装体。
Container:
用于包含其他组件的组件。
Container是component的一个抽象子类。
它允许其他的组件被嵌套在里面。
Panel是container的最简单的类,container的令一个子类是window。
Window有两种形式:
Frame(框架)和Dialog(对话框)。
Frame和Dialog是Window的子类,Frame是一个带有标题和缩放角的窗口,对话没有菜单条,尽管它不能移动,但它不能缩放。
常见的界面的组合:
组件放在Panel里面。
Panel放在Frame上,也就是说通常用Panel来进行界面的组合,一个Panel就是一个界面,那么界面的切换就相当于切换Framel里面的Panel
菜单的实现:
不能将菜单加到一般容器中。