《java基础知识点总结.doc》由会员分享,可在线阅读,更多相关《java基础知识点总结.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Created by AIwen on 2017/5/14、java就是面向对象得程序设计语言;类可被认为就是一种自定义得数据类型,可以使用类来定义变量,所有使用类定义得变量都就是引用变量,它们将会引用到类得对象。类用于描述客观世界里某一类对象得共同特征,而对象则就是类得具体存在,java程序使用类得构造器来创建该类得对象。java也支持面向对象得三大特征:封装、继承、与多态。java提供了private、protected、与public三个访问控制修饰符来实现良好得封装,提供了extends关键字让子类继承父类,子类继承父类就可以继承到父类得成员变量与与方法,如果访问控制允许,子类实例可以
2、直接调用父类里定义得方法。继承就是实现类复用得重要手段。使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性。面向对象得程序设计过程中有两个重要得概念:类(Class)与对象(object,也被称为实例,instance)。类可以包含三种最常见得成员:构造器、成员变量、与方法。构造器用于构造该类得实例,java语言通过new关键字类调用构造器,从而返回该类得实例。构造器就是一个类创建对象得根本途径,如果一个类没有构造器,这个类通常无法创建实例。因此java语言提供了一个功能:如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认得构造器,这个构造器总就是没有参数得。
3、一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。构造器用于对类实例进行初始化操作,构造器支持重载,如果多个重载得构造器里包含了相同得初始化代码,则可以把这些初始化代码放置在普通初始化块里完成,初始化块总在构造器执行之前被调用。静态初始化块代码用于初始化类,在类初始化阶段被执行。如果继承树里某一个类需要被初始化时,系统将会同时初始化该类得所有父类。构造器修饰符:可以就是public、protected、private其中之一,或者省略构造器名:构造器名必须与类名相同。注意:构造器既不能定义返回值类型,也不能使用void声明构造器没有返回值。如果为构造器定义了返回值类型,或使用void
4、声明构造器没有返回值,编译时不会出错,但java会把这个所谓得构造器当成方法来处理它就不再就是构造器。实际上类得构造器就是有返回值得,当使用new关键字来调用构造器时,构造器返回该类得实例,可以把这个类得实例当成构造器得返回值。因此构造器得返回值类型总就是当前类,无须定义返回值类型。不要在构造器里显式得使用return来返回当前类得对象,因为构造器得返回值就是隐式得。java类名必须就是由一个或多个有意义得单词连缀而成得,每个单词首字母大写,其她字母全部小写,单词与单词之间不要使用任何分隔符。成员变量:成员变量得修饰符:public、protected、private、static、final
5、前三个只能出现一个再与后面得修饰符组合起来修饰成员变量,也可省略。成员变量:由一个或者多个有意义得单词连缀而成,第一个单词首字母小写,后面每个单词首字母大写,其她字母全部小写,单词与单词之间不要使用任何分隔符。类型:可以就是java语言允许得任何数据类型,包括基本类型与引用类型。成员方法:方法修饰符:public、protected、private、static、final、abstract,前三个只能出现一个,static与final最多只能出现其中得一个,与abstract组合起来使用。也可省略。返回值类型:可以就是java语言得允许得任何数据类型,包括基本类型与引用类型。方法名:与成员变
6、量得方法命名规则相同,通常建议方法名以英文动词开头。方法体里多条可执行语句之间有严格得执行顺序,排在方法体前面得语句总先执行,排在方法体后面得语句总就是后执行。static就是一个特殊得关键字,它可用于修饰方法、成员变量等成员。static修饰得成员表明它属于这个类本身,而不属于该类得单个实例,因此通过把static修饰得成员变量与方法被称为类变量、类方法(静态成员变量,静态成员方法);不使用static修饰得成员变量与方法称为实例变量与实例方法(非静态成员变量,非静态成员方法)。静态成员不能直接访问非静态成员。static得真正作用就就是用于区分成员变量、方法、内部类、初始化块,这四种成员到
7、底属于类本身还就是属于实例。有static修饰得成员属于 类本身,没有类修饰得成员属于该类得实例。java类大致有如下作用:定义变量创建对象调用类得类方法或访问类得类变量。定义一个类就就是为了重复创建该类得实例,同一个类得多个实例具有相同得特征,而类则就是定义了多个实例得共同特征。类里定义得方法与成员变量都可以通过类或实例来调用。Static修饰得方法与成员变量,既可通过类来调用,也可通过实例来调用;没有使用static修饰得普通方法成员变量,只可通过实例来调用。 Person p=new Person;这行代码创建了一个Person实例,也被称为Person对象,这个Person对象被赋给p
8、变量。在这行代码中实际上产生了两个东西,一个就是p变量,一个就是Person对象。P引用变量本身只存储了一个地址值,并未包含任何实际数据,但它指向实际得Person对象。Person对象由多块内存组成,不同内存块分别存储了Person对象得不同成员变量。类就是一种引用数据类型,因此程序中定义得Person类型得变量实际上就是一个引用,它被存放在栈内存里,指向实际得Person对象;而真正得Person对象则存放在堆内存中。当一个对象被创建成功以后,这个对象将保存在堆内存中,java程序不允许直接访问堆内存中得对象,只能通过该对象得引用操作该对象。堆内存里得对象可以有多个引用,即多个引用变量指向
9、同一个对象。如果堆内存里得对象没有任何变量指向该对象,那么程序将无法再访问该对象,这个对象也就变成了垃圾,java垃圾回收机制将回收该对象,释放该对象所占得内存区。对象得this引用Java提供了一个this关键字,this关键字总就是指向调用该方法得对象。This作为对象得默认引用有两种情形:构造器中引用该构造器正在初始化得对象;在方法中引用调用该方法得对象。This关键字最大得作用就就是让类中一个方法,访问该类里得另一个方法或者实例变量。Java允许对象得一个成员直接调用另一个成员,可以省略this前缀。如果在static修饰得方法中使用this关键字,则这个关键字就无法指向合适得对象,所
10、以,static修饰得方法中不能使用this引用。Java编程时不要使用对象去调用static修饰得成员变量、方法、而就是应该使用类去调用static修饰得成员变量、方法。如果确实需要在静态方法中访问另一个普通方法,则只能重新创建一个对象。大部分得时候,普通方法访问其她方法、成员变量时无须使用this前缀,但如果方法里有个局部变量与成员变量同名,但程序又需要在该方法里访问这个被覆盖得成员变量,则必须使用this前缀。This引用也可以用于构造器中作为默认引用,由于构造器时直接使用new关键字来调用,而不就是使用对象来调用得,所以this在构造器中代表该构造器正在初始化对象。方法:Java里得方
11、法不能独立存在,所有得方法都必须定义在类里。如果这个方法就是用来static修饰,则这个方法属于这个类,否则这个方法属于这个类得实例。执行方法时,必须使用类或者对象作为调用者。同一个类得一个方法调用另外一个方法时,如果被调方法就是普通方法,则默认使用this作为调用者;如果被调用方法就是静态方法,则默认使用类作为调用者。也就就是说java中瞧起来某些方法可以被独立执行,但实际上还就是使用this或者类来作为调用者。Java里方法参数传递方式只有一种:值传递。所谓值传递,就就是讲实际参数值得副本(复制品)传入方法内,而参数本身不会受到任何影响。从JDK1、5之后,java允许定义形参个数可变得参
12、数,从而允许为方法指定数量不确定得形参。如果在定义方法时,在最后一个形参得类型后增加三点(),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。public class Varargs /定义形参可变得方法 public static void test(int a,String、 books) /books被当成数组处理 for(String tmp:books) System、out、println(tmp); System、out、println(a); public static void main(String args) /调用test方法 test(5,hello,wor
13、ld,aa); 数组形式得形参可以处于形参列表得任意位置,但个数可变得形参只能处于形参表得最后。也就就是说最多只能有一个长度可变得形参。形参可变与传入数组得区别:public static void test(int a,String、 books);public static void test(int a,String books);test(5,aa,bb,cc);test(5,new Stringaa,bb,cc);方法重载:Java允许同一个类里定义多个同名方法,只要形参列表不同就行。如果同一个类中包含了两个或两个以上方法得方法名相同,但形参列表不同,则被称为方法得重载。Java程序
14、确定一个方法需要三个要素:调用者;方法名;形参列表。方法得重载要求就就是两同一不同:同一个类中方法名相同,参数列表不同。至于方法得其她部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。public class OverloadVarargs public void test(String msg) System、out、println(只有一个参数得test); /因为前面已经有了一个字符串参数得方法,则长度可变形参里不包含一个字符串参数得形式 public void test(String 、books) System、out、println(形参可变得test方法); public
15、 static void main(String args) OverloadVarargs olv=new OverloadVarargs; /下面两次调用将执行第二个test方法 olv、test; olv、test(aa,bb); /将调用第一个test方法 olv、test(aa); /将调用第二个test方法 olv、test(new Stringaa); Java中变量分为:成员变量与局部变量。成员变量被分为类变量与实例变量两种,定义成员变量时没有static修饰得就就是实例变量,有static修饰得就就是类变量。l 变量得命名:从程序得可读性角度来瞧,应该就是多个有意义得单词连缀
16、而成,其中第一个单词首字母小写,后面每个单词首字母大写。l 如果通过一个实例修改了类变量得值,由于这个类变量并不属于它,而就是属于它对应得类。因此,修改得依然就是类变量,与通过该类来修改类变量得结果完全相同,这会导致该类得其她实例来访问这个类变量时也将获得这个被修改过得值。l 成员变量无须显式初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类得初始化阶段或创建该类得实例时,进行默认初始化。l 实例变量随实例得存在而存在,而类变量则随类得存在而存在。实例也可访问类变量,同一个类得所有实例访问类变量时,实际上访问得就是该类本身得同一个变量,也就就是说,访问了同一片内存区。l 局部变量根据
17、定义形式得不同,又可分为三种形式:形参,方法局部变量,代码块局部变量;局部变量除了形参之外,都必须显示初始化。l 在同一个类里,成员变量得作用范围就是整个类内有效,一个类里不能定义两个同名得成员变量,即使一个就是类变量,一个就是实例变量也不行;一个方法里不能定义两个同名得方法局部变量,方法局部变量与形参也不能同名;同一个方法中不同代码块内局部变量可以同名;如果先定义代码块局部变量,后定义方法局部变量,前面定义得代码块局部变量与后面定义得方法局部变量也可同名、l Java允许局部变量与成员变量同名,如果方法里得局部变量与成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖得成员变
18、量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。public class VariableOverrideTest /定义一个name实例变量 private String name=李刚; /定义一个price类变量 private static double price=78、0; public static void main(String args) /方法里局部变量覆盖成员变量,将输出price得局部变量65 int price=65; System、out、println(price); /使用类名作为price变量得限定,将输出price类变
19、量得值 System、out、println(VariableOverrideTest、price); new VariableOverrideTest、info; public void info /方法里得局部变量,局部变量覆盖成员变量,输出name局部变量得值:孙悟空 String name=孙悟空; System、out、println(name); /将输出name实例得值:李刚 System、out、println(this、name); 当系统加载类或创建该类得实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。Person p1=new Per
20、son;时,如果这行代码就是第一次使用Person类,则系统通常会在第一次使用Person类时加载这个类,并初始化这个类。局部变量定以后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。局部变量不属于任何类或者实例,因此它总就是保存在其所在方法得栈内存中。如果局部变量时基本类型得变量,则直接把这个变量得值保存在该变量对应得内存中;如果局部变量就是一个引用类型得变量,则这个变量里存放得就是地址,通过该地址引用到该变量实际引用得对象或者数组。栈内存中得变量无须系统垃圾回收,往往随就是方法或代码块得运行结束而结束。如果定义得某个变量就是用于描述某个类或某个对象得固有信息得,这种变量应该定
21、义成成员变量。如果这种信息对这个类得所有实例完全相同,或者说它就是类相关得,则该定义成类变量;如果这个信息就是实例相关得,则应该定义成实例变量。用于保存某个类或某个实例状态信息得变量通常应该使用成员变量。如果某个信息需要在某个类得多个方法之间进行共享,则这个信息应该使用成员变量来保存。隐藏与封装访问控制符用于控制一个类得成员就是否可以被其她类访问。Java提供了3个访问控制修饰符:private,protected,与public,还有一个默认访问控制修饰符defaultPrivate(当前类访问权限);default(包访问权限);protected(子类访问权限):如果一个成员使用prot
22、ected访问修饰符修饰,那么这个成员既可以被同一个包中得其她类访问,也可以被不同包中子类访问。通常情况下,使用protected修饰得方法,通常希望其子类来重写这个方法。Public(公共访问权限)对于局部变量而言,其作用域就就是它所在得方法,不可能被其她类访问,因此不能使用访问控制符来修饰。外部类只能有两种访问控制级别:public与默认,不能使用private与protectedpublic class Person private String name; private int age; public void setName(String name) if(name、length6
23、|name、length 100 | age 0) System、out、println(error); else this、age = age; public int getAge return this、age; public class PersonTest public static void main(String args) Person p=new Person; /下面得变量不会运行错误,但就是会提示错误 p、setAge(1000); /因为上面没有成功设置p得age成员,故输出0 System、out、println(p、getAge); /成功设置p得age成员 p、se
24、tAge(30); System、out、println(p、getAge); /成功设置p得name成员 p、setName(李刚); System、out、println(p、getName); 构造器:构造器最大得用途就是创建对象时执行初始化。当创建一个对象时,系统为这个对象得实例变量进行默认初始化,这种默认得初始化把所有基本类型得实例变量设为0(对数值型实例变量)或false(对布尔型实例变量),把所有引用类型得实例变量设为null。如果想改变这种默认得初始化,想让系统创建对象时就位该对象得实例变量显式指定初始值,就可以通过构造器来实现。因为构造器主要用于被其她方法调用,用以返回该类得
25、实例,因而通常把构造器设置成public访问权限,从而允许系统中任何位置得类来创建该类得对象。如果设置成protected,主要用于被子类调用;设置为private,阻止其她类创建该类得实例。如果系统中包含了多个构造器,其中一个构造器B得执行体里完全包含另一个构造器A得执行体。为了这构造器B中调用构造器A中得初始化代码,又不会重新创建一个java对象,可以使用this关键字来调用相应得构造器。public class Apple public String name; public String color; public double weight; /两个参数得构造器 public App
26、le(String name,String color) this、name=name; this、color=color; /三个参数得构造器 public Apple(String name,String color,double weight) /通过this调用另一个重载得构造器得初始化代码 this(name,color); /通过this引用该构造器正在初始化得Java对象 this、weight=weight; 使用this调用另一个重载得构造器只能在构造器中使用,而且必须作为构造器执行体得第一条语句。使用this调用重载得构造器时,系统会根据this后括号里得实参来调用形参列表
27、与之对应得构造器类得继承:Java继承通过extends关键字来实现实现继承得类被称为子类,被继承得类被称为父类,有得也称为基类、超类。因为子类就是一种特殊得父类,因此父类包含得范围总比子类包含得范围要大。Java子类不能获得父类得构造器public class Fruit public double weight; public void info System、out、println(weight); public class Apple extends Fruit /Apple类继承了Fruit类,所以Apple对象也就有了weight成员变量与info方法 public static
28、void main(String args) Apple a=new Apple; /Apple对象本身没有weight成员变量,但就是,Apple父类有weight成员变量,所以,也可以访问Apple对象得weight成员变量 a、weight=56; /调用Apple对象得info方法 a、info; Java类只能有一个直接父类,实际上,Java类可以有无限多个间接父类。重写父类方法:子类扩展了父类,子类就是一个特殊得父类。大部分时候,子类总就是以父类为基础,额外增加新得成员变量与方法。但有一种情况例外:子类需要重写父类方法。public class Bird /Bird类得fly方法
29、public void fly System、out、println(我在天空中飞); public class Ostrich extends Bird /重写Bird类得fly方法 public void fly System、out、println(我在陆地上飞); public static void main(String args) /创建Ostrich对象 Ostrich or=new Ostrich; /执行Ostrich对象得fly方法,将输出“我在陆地上飞” or、fly; 这种子类包含与父类同名方法得现象被称为方法重写(Override),也被称为方法覆盖。可以说子类重写
30、了父类得方法,也可以说子类覆盖了父类得方法。方法得重写要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同;“两小”指得就是子类方法得返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出得异常类应比父类声明抛出得异常类更小或相等;“一大”指得就是子类方法得访问权限应比父类方法得访问权限更大或相等。覆盖方法与被覆盖方法要么都就是类方法,要么都就是实例方法。当子类覆盖了父类方法后,子类得对象将无法访问父类中被覆盖得方法,但可以在子类方法中调用被覆盖得方法。如果需要在子类方法中调用父类中被覆盖得方法,则可以使用super(被覆盖得就是实例方法)或者父类类名(被覆盖得就是类方法)作为
31、调用者来调用父类中被覆盖得方法。如果父类方法具有private访问权限,则该方法对其子类就是隐藏得,因此其子类无法访问该方法,也就就是无法重写该方法。重载只要发生在同个类多个同名方法之间,而重写发生在子类与父类同名方法之间。父类方法与子类方法之间也可能发生重载。Super限定:Super就是Java提供得一个关键字,super用于限定该对象调用它从父类继承得到得实例变量或方法。Super不能出现在static修饰得方法中。Static修饰得方法就是属于类得,该方法得调用者可能就是一个类,而不就是对象,因而super限定就失去了意义。如果在构造器中使用super,则super用于限定该构造器初始
32、化得就是该对象从父类继承得到得实例变量,而不就是该类自己定义得实例变量。如果子类定义了与父类同名得实例变量,则会发生子类实例变量隐藏父类实例变量得情形。在正常情况下,子类里定义得方法直接访问该实例变量,默认会访问到子类中定义得实例变量,无法访问到父类中被隐藏得实例变量。在子类定义得实例方法中可以通过super来访问父类中被隐藏得实例变量。public class BaseClass public int a=5;public class SubClass extends BaseClass public int a=7; public void accessOwner System、out、p
33、rintln(a); public void accessBase /通过super来限定访问从父类继承得到得a实例变量 System、out、println(super、a); public static void main(String args) SubClass sb=new SubClass; sb、accessBase; /输出5 sb、accessOwner; /输出7 如果在某个方法中访问名为a得成员变量,但没有显式指定调用者,则系统查找a得顺序为:1. 查找该方法中就是否有名为a得局部变量2. 查找当前类中就是否包含名为a得成员变量3. 查找a得直接父类中就是否包含名为a得成
34、员变量,一次上溯a得所有父类,直到java、lang、Object类,如果最终不能找到名为a得成员变量,则系统出现编译错误。如果被覆盖得就是类变量,在子类得方法中则可以通过父类名作为调用者来访问被覆盖得类变量当程序创建一个子类对象时,系统不仅会为该类中定义得实例变量分配内存,也会为它从父类继承得到得所有实例变量分配内存,即使子类定义了与父类中同名得实例变量。如果在子类里定义了与父类中已有变量同名得变量,那么子类中定义得变量会隐藏父类中定义得变量。注意不就是完全覆盖,因此系统在创建子类对象时,依然会为父类中定义得、被隐藏得变量分配内存空间。public class Parent public S
35、tring tag=helloworld;public class Derived extends Parent /定义一个私有得tag实例变量来隐藏父类得tag实例变量 private String tag=abc;public class HideTest public static void main(String args) Derived d=new Derived; /程序不可访问d得私有变量tag,所以会出现编译错误/ System、out、println(d、tag); /将d变量显式得向上转型为Parent后,即可访问tag实例变量 System、out、println(Pa
36、rent)d)、tag); 调用父类构造器:子类不会获得父类得构造器,但子类构造器里可以调用父类构造器得初始化代码。在一个构造器里调用另一个重载得构造器使用this调用来完成,在子类构造器中调用父类构造器使用super调用来完成。public class Base public double size; public String name; public Base(double size,String name) this、size=size; this、name=name; public class Sub extends Base public String color; public
37、Sub(double size,String name,String color) /通过super调用父类构造器得初始化过程 super(size,name); this、color=color; public static void main(String args) Sub s=new Sub(5、6,测试,red); System、out、println(s、size+,+s、name+,+s、color); Super调用得就是其父类得构造器,而this调用得就是同一个类中重载得构造器;因此,使用super调用父类得构造器也必须出现在子类构造器执行体得第一行,所以this调用与sup
38、er调用不会同时出现。当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行其父类得构造器依次类推,创建任何java对象,最先执行得总就是java、lang、Object类得构造器。public class Creature public Creature System、out、println(无参); public class Animal extends Creature public Animal(String name) System、out、println(Animal带一个参数得构造器+name); public An
39、imal(String name,int age) /this调用同一个重载构造器 this(name); System、out、println(Animal带两个参数得构造器+age); public class Wolf extends Animal public Wolf super(灰太狼,4); System、out、println(wolf无参构造器); public static void main(String args) Wolf wf=new Wolf; /虽然main方法只创建了一个Wolf对象,但系统在底层完成了复杂得操作,运行将会得到/ 无参/ Animal带一个参数
40、得构造器灰太狼/ Animal带两个参数得构造器4/ wolf无参构造器 创建任何对象总就是从该类所在继承树最顶层类得构造器开始执行,然后依次向下执行,最后才执行本类得构造器。如果某个父类通过this调用了同类中重载得构造器,就会依次执行此父类得多个构造器。4、7多态:Java引用变量有两个类型:一个就是编译时类型,一个就是运行时类型。编译时类型由声明该变量时使用得类型决定,运行时类型由实际赋给该变量得对象决定。如果编译时类型与运行时类型不一致,就可能出现所谓得多态。public class BaseClass public int book=6; public void base Syste
41、m、out、println(父类得普通方法); public void test System、out、println(父类被覆盖得方法); public class SubClass extends BaseClass /重写定义一个book实例变量隐藏父类得book实例变量 public String book=abc; public void test System、out、println(子类得覆盖父类得方法); public void sub System、out、println(子类得普通方法); public static void main(String args) /编译时类型与运行时类型完全一样,因此不存在多态 BaseClass bc=new BaseClass; /输出父类bc对象得成员变量值:6 System、out、println(bc、book); bc、test; bc、base; /编译时类型与运行时类型完全一样,因此不存在多态 SubClass sbc=new SubClass; /输出子类对象sbc得成员变量值:abc System、out、println(sbc、book); sbc、test; sbc、sub; /下面调用将执行从父类继承到得base方法 sbc、base; /编译时