2023年java基础知识点总结.docx
《2023年java基础知识点总结.docx》由会员分享,可在线阅读,更多相关《2023年java基础知识点总结.docx(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Cre a ted b y Alwen on 2023/5 / 1 4 .java是面向对象的程序设计语言;类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义 的变量都是引用变量,它们将会引用到类的对象。类用于描述客观世界里某一类对象的共同特性,而对象则是类的具 体存在,j a va程序使用类的构造器来创建该类的对象。Aja v a也支持面向对象的三大特性:封装、继承、和多态。j a v a提供了 p rivat e p r otec t ed和public 三个访问控制修饰符来实现良好的封装,提供了 ex t ends关键字让子类继承父类,子类继承父类就可以继承到父类的
2、成员变量和和方法,假如访问控制允许,子类实例可以直接调用父类里定义的方法。继承是实现类复用的重要手段。 使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性。面向对象的程序设计过程中有两个重要的概念:类(Class)和对象(obj ect,也被称为实例,in s tance) o类可 以包含三种最常见的成员:构造器、成员变量、和方法。a构造器用于构造该类的实例,java语言通过new关键字类调用构造器,从而返回该类的实例。构造器是一个类创建 对象的主线途径,假如一个类没有构造器,这个类通常无法创建实例。因此java语言提供了一个功能:假如程序员 没有为一个类编写构造器,则
3、系统会为该类提供一个默认的构造器,这个构造器总是没有参数的。一旦程序员为一个 类提供了构造器,系统将不再为该类提供构造器。构造器用于对类实例进行初始化操作,构造器支持重载,假如多个重载的构造器里包含了相同的初始化代码,则可以 把这些初始化代码放置在普通初始化块里完毕,初始化块总在构造器执行之前被调用。静态初始化块代码用于初始化 类,在类初始化阶段被执行。假如继承树里某一个类需要被初始化时,系统将会同时初始化该类的所有父类。构造器修饰符:可以是public、pr o t e c t ed、priva t e其中之一,或者省略构造器名:构造器名必须和类名相 同。注意:构造器既不能定义返回值类型,也
4、不能使用void声明构造器没有返回值。假如为构造器定义了返回值类型, 或使用v o id声明构造器没有返回值,编译时不会犯错,但j ava会把这个所谓的构造器当成方法来解决一一它就不 再是构造器。超事实上类的构造器是有返回值的,当使用new关键字来调用构造器时,构造器返回该类的实例,可以把 这个类的实例当成构造器的返回值。因此构造器的返回值类型总是当前类,无须定义返回值类型。不要在构造器里显 式的使用return来返回当前类的对象,由于构造器的返回值是隐式的。占java类名必须是由一个或多个故意义的单词连缀而成的,每个单词首字母大写,其他字母所有小写,单词与单词之 间不要使用任何分隔符。A2
5、.查找当前类中是否包含名为a的成员变量.查找a的直接父类中是否包含名为a的成员变量,一次上溯a的所有父类,直到j a va. Ian g. Obje c t类,假如最 终不能找到名为a的成员变量,则系统出现编译错误。假如被覆盖的是类变量,在子类的方法中则可以通过父类名作为调用者来访问被覆盖的类变量当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分派内存,也会为它从父类继承得到的所有实例变 量分派内存,即使子类定义了与父类中同名的实例变量。假如在子类里定义了与父类中已有变量同名的变量,那么子类中定义的变量会隐藏父类中定义的变量。注意不是完全 覆盖,因此系统在创建子类对象时,仍然会为父类
6、中定义的、被隐藏的变量分派内存空间。public c 1 ass Par e n t a publ i c Str i ng tag= h e 1 1 oworl d ”; public class Deri v ed extends Parent a/定义一个私有的tag实例变量来隐藏父类的tag实例变量pri v a te St r i n g tag=abc publi c cl a ss HideT e s t 仙 pu b lie s tat i c voi d main (String arg s ) aD e ri v edd=new Der i ve d () ;A/程序不可访
7、问d的私有变量t a g,所以会出现编译错误/Sys t em. out. pri n tin (d. tag);/将d变量显式的向上转型为P a r e nt后,即可访问t a g实例变量S ystem. out. p r i nt In (Pare n t) d). ta g) ;a a)调用父类构造器:子类不会获得父类的构造器,但子类构造器里可以调用父类构造器的初始化代码。在一个构造器里调用另一个重载的构造器使用th i s调用来完毕,在子类构造器中调用父类构造器使用SU p er调用来完毕。pu b lie class Base a. . public double size;pub
8、lie String n a me;A . public Base (double size, S tr i ng name) t h is. s ize=si z e;this. name=nam e ;a ap u blic cla s s Su b e xtends Base a public Str i n g color; apubli c Su b (do uble s i ze, Str i ng name, String color) a/通过super调用父类构造器的初始化过程super(size, name);this, col o r=color; a publ i c
9、static vo i d mai n (S tr i ng args) aSub s= new Su b (5. 6,测试,” re d );Sy s tem. o ut. prin t 1 n (s. s ize+”, +s name+”, +s c o 1 o r) )S u per调用的是其父类的构造器,而this调用的是同一个类中重载的构造器;因此,使用sup er调用父类的构造器 也必须出现在子类构造器执行体的第一行,所以thi s调用和super调用不会同时出现。当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行
10、其父类的构造器依次类推,创建任何java对象,最先执行的总是java. lang. Obj e c t类的构造器。pu b lie cl a ss Cr e ature a p u b li c Crea t ure () aS y stem, on print ln(n 无参”);.public c la s s An i mal extend s Creature a pub 1 ic Animal (Str ing name) aSystem. out. print 1 n( A n imal 带一个参数的构造器+n a me)a publ i c An i mal ( S trin g
11、name, in t a ge) /this调用同一个重载构造器二this ( n ame);S y stem.i n t 1 n ( An i ma 1 带两个参数的构造器 +age);. public c 1 a ss Wolf extends Animal p u blic Wolf () asuper (灰太狼,4) ;aS y stem. out. p r i n tin (wolf 无参构造器”);)pu b lie st a tic void ma i n (St r ing ar g s) Wolf wf=new Wolf ();/虽然main方法只创建了一个Wolf对象,但系
12、统在底层完毕了复杂的操作,运营将会得到/ 无笏Anima 1带一个参数的构造器灰太狼/ Anim a 1带两个参数的构造器4/wolf无参构造器口 创建任何对象总是从该类所在继承树最顶层类的构造器开始执行,然后依次向下执行,最后才执行本类的构造器。假 如某个父类通过this调用了同类中重载的构造器,就会依次执行此父类的多个构造器。47多态:Jav a引用变量有两个类型:一个是编译时类型,一个是运营时类型。编译时类型由声明该变量时使用的类型决定, 运营时类型由实际赋给该变量的对象决定。假如编译时类型和运营时类型不一致,就也许出现所谓的多态。public class Bas e C 1 ass a
13、 publ ic int book= 6 ;A Syst e m. out. p r i ntl n (父类的普通方法);a pub 1 ic void test () S yst e m. out. printl n (父类被覆盖的方法”); )publ i c cla s s S u bC 1 a s s e x te n d s Bas e Clas s /重写定义一个bo o k实例变量隐藏父类的book实例变量publ i c String book =a b c ;apubl i c void test () a类的覆盖父类的方法);public v o id su b () S
14、y st e m. out. printin (子类的普通方法”)鸿 )pub 1 i c sta t ic v o id mai n (S t ring口 a r gs) /编译时类型和运营时类型完全同样,因此不存在多态口publi c v o id base() aS y s tem. out. p rintln(子BaseC lass bc= new B a seC 1 a输出父类b c对象的成员变量值:6 口输出父类b c对象的成员变量值:6 口Sys t em. ou t .p r in t In (be. boo k);be.test ();be. base();/编译时类型和运营
15、时类型完全同样,因此不存在多态S ubC las s sbc= n ew Su b Cla s s () ; a /输出子类对象 s b c 的成员变量值:a b c口System, out. pr i nt 1 n ( s be. b o o k);as be. test ();sbc. s ub() ;A/下面调用将执行从父类继承到的ba s e()方法sb c . ba s e ();/编译时类型和运营时类型不同样,发生多态发生Ba s eC 1 ass ployB c=newSubClass ();访问的是父类对象的实例变量System.oat.pr i ntln ( p 1 o y
16、B c . bo o k) ;A/执行从父类继承到的base。方法p 1 oyBc. ba s e ();/调用将执行当前类的test ()方法ployB c . te s t();/ ploy Be. sub ();由于编译时类型是B a seClas s,没有提供sub()方法,所以编译会出现错误由于子类是一种特殊的父类,因此java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被 称为向上转型,向上转型由系统自动完全。a对象的实例变量不具有多态性。注:引用变量在编译阶段只能调用其编译时类型所具有的方法,但运营时则执行它运营时类型所具有的方法。因此在编写 Java代码时
17、,引用变量只能调用声明该变量时所用类里包含的方法。例如:0 b ject p=n e w Person。代码定义 了一个变量p,则这个p只能调用Ob ject类的方法,而不能调用Per s on类里的方法。假如需要让这个引用变量调用它运营时类型的方法,则必须把它强制类型转化成运营时的类型,强制类型转换符需要 借助于类型转换运算符,用法是(type) var iabl e强制类型转换需要注意:基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型涉及,整数型、字符型和浮点型;但数值类型和布 尔类型之间不能进行类型转换。引用类型之间的转换只能在具有继承关系的两个类型之间进行,假如是两个没有任
18、何继承关系的类型,则无法进行类 型转换。考虑到强制类型转换时也许出现异常,因此进行类型转换之前应先通过instan ceof运算符来判断是否可以成功转 换。注意:当把子类对象赋给父类引用变量时,被称为向上转型,这种转型总是可以成功的,这也从另一个侧面证实了子类是一种 特殊的父类。这种转型只是表白这个引用变量的编译时类型是父类,但实际执行它的方法时,仍然表现出子类对象行 为方式。但把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,并且还也许在运营时产生Clas s Ca s t Exception异常,使用instanceof运算符可以让强制类型转换更安全。I n st a nceof
19、运算符:In s tanceof运算符前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口),它用于判 断前面的对象是否是后面的类,或者其子类、实现的实例。假如是,则返回ture,否则返回false.在使用instanceof运算符时需要注意:i n s t a nceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。p ublic cl a ss instanceof T est (publi c stat i c void main (String1 a r gs) 声明h ello 时使用 Obj e c t类,
20、J/HJhe 11 oObj e ctU/Object 是所有类的父类,但h e 1 lo变量的实际类型是S tringU Obj ec t hello=h e 1 lo”;System, out. print 1 n (h ell o i ns t an ceof Ob j ect);Stri ng和Obj e c t类存在继承关系,可以进行i ns t a nee o f运算,返回trueSystem, o ut. pri n t 1 n (h e llo i nstanc e of S tring);/Math和Object类存在继承关系,可以进行i n stance o f运算,返回f
21、alseSy s t e m. out. p r int 1 n( (hel 1 o i n stanceof M a th);/St r ing 实现了Compa rabel 接口,所以返回 t r u e 口Sy s t e m. out. p rin tln(h e 1 1 o i n s ta n ceof Com p a rab le);St r in g a= hell o ”;/S t r ing类和Math类没有继承关系,所以下面的代码编译无法通过/Sy s t em. out. prin t In (a i n s t anc e of Ma t h ) ; 4.8初始化块:
22、初始化块是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类的所有对象所进行的的初始化解决 完全相同。假如两个构造器中有相容的初始化代码,且这些初始化代码无须接受参数,就可以把它们放在初始化块中 定义。当创建ja v a对象时,系统总是先调用该类里定义的初始化块,相同类型的初始化块之间按顺序执行。初始化块在 执行构造器之前执行。与构造器类型,创建一个java对象时,不仅会执行该类的普通初始化块和构造器,并且系统会一直上溯到jav a . 1 an g.Object类,先执行ja v a. 1 a n g . Object类的初始化块,再开始执行j a va.1 ang. Objec
23、t的构造器,依次向 下执行其子类的初始化块,再开始执行其子类的构造器最后才执行该类的初始化块和构造器,返回该类的对象。静态初始化块:假如定义初始化块时使用了 static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块(普通初 始化块负责对对象执行初始化,类初始化块则负责对类进行初始化)。静态初始化块总是类相关的,系统将在类初始化 阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。通常静态初始化块用于对类变量执行初始化解决O与普通初始化块类型,系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,并且还会一直上溯到j ava.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 java 基础 知识点 总结
限制150内