




已阅读5页,还剩122页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
疯狂java讲义笔记一、Java概述1.java编译产生与平台无关的字节码(*.class文件),再在JVM里面执行。2.JVM是一个抽象的计算机,具有指令集并使用不同的存储区,负责执行指令,还要管理数据、内存和寄存器。3.JVM细节:指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区。4.只运行java程序可以只安装JRE,若要开发则要JDK5.bin路径下的绝大部分命令都是包装了tools.jar文件里的工具类。6.JDK1.5之后可以不用设置CLASSPATH环境变量。7.main方法的 public 和 static可以交换位置。8.垃圾回收相关:将对象引用设置为null将加快垃圾回收;可以通过System.gc()来建议系统进行垃圾回收;垃圾回收的精确性主要包括a.精确标记或者的对象b.精确地定位对象之间的引用关系。二、理解面向对象1.基本特征: a.封装:将对象实现细节隐藏起来,然后通过一些共用方法来暴露该对象的功能 b.继承: c.多态:子类对象可以直接赋给父类变量,运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。三、数据类型和运算符1.注释,单行注释/ ,多行注释 /* . */,文档注释/* . */2.注释中常用标记author指定java程序作者,version指定源文件的版本,deprecated不推荐使用的方法,param方法的参数说明信息,return方法的返回值说明信息,see参见,关于指定交叉参考的内容,exception抛出异常类型,throws抛出的异常,和exception同意。类或接口文档中的标记see、deprecated、author、version;方法或构造器文档中的标记see、deprecated、param、return、throws和exception等;出现在Field文档注释中的有see、deprecated等 java view plain copy print?1 package yeeku; 2 3 /* 4 * Description: 5 * 网站: 疯狂Java联盟 6 * Copyright (C), 2001-2012, Yeeku.H.Lee 7 * This program is protected by copyright laws. 8 * Program Name: 9 * Date: 10 * author Yeeku.H.Lee 11 * version 1.0 12 */ 13 public class JavadocTagTest 14 15 /* 16 * 一个得到打招呼字符串的方法。 17 * param name 该参数指定向谁打招呼。 18 * return 返回打招呼的字符串。 19 */ 20 public String hello(String name) 21 22 return name + ,你好!; 23 24 3.标识符中可以包含$符号4.Java语言指出的类型,基本类型(primitive type):int等,引用类型(reference type):类、接口、数组、null5.java7中新增了二进制类型。以0b或者0B开头6.特殊的三个浮点数:正无穷大Double或Float的POSITIVE_INFINITY表示,负无穷大NEGATIVE_INFINITY表示,非数NaN7.java7中可以在数值中使用下划线。int binVal = 0B1000_0000_0000_0011;double pi = 3.14_15_92;四、数组1.数组是一种数据类型,它本身市一中引用类型。 int就是一种类型。2.java数组定义格式 type arrayName 和 type arrayName; 推荐第一种。这样只定义了一个引用变量,没有分配内存空间。3.初始化: a.静态初始化arrayName= new type element1,element2.,type与element类型相同。也可以arrayName = element1, element2. b.动态初始化arrayName= new typelength4.foreach用于遍历数组和集合,for (type variableName : array | collection) .,只提供访问,不提供修改,即修改无效。5.基本数据类型数组直接在数组引用的内存存储值,而引用类型数组数组元素是引用,需要再次申请堆内存。6.二维数组的初始化java view plaincopyprint?25 public class TwoDimensionTest 26 27 public static void main(String args) 28 29 /定义一个二维数组 30 int a; 31 /把a当成一维数组进行初始化,初始化a是一个长度为4的数组 32 /a数组的数组元素又是引用类型 33 a = new int4; 34 /把a数组当成一维数组,遍历a数组的每个数组元素 35 for (int i = 0 , len = a.length; i len ; i+ ) 36 37 System.out.println(ai); 38 39 /初始化a数组的第一个元素 40 a0 = new int2; 41 /访问a数组的第一个元素所指数组的第二个元素 42 a01 = 6; 43 /a数组的第一个元素是一个一维数组,遍历这个一维数组 44 for (int i = 0 , len = a0.length ; i len ; i + ) 45 46 System.out.println(a0i); 47 48 49 /同时初始化二维数组的2个维数 50 int b = new int34; 51 52 /使用静态初始化的语法来初始化一个二维数组 53 String str1 = new Stringnew String3 54 , new Stringhello; 55 /使用简化的静态初始化语法来初始化二维数组 56 String str2 = new String3 57 , new Stringhello; 58 System.out.println(str110); 59 System.out.println(str210); 60 61 7.数组操作的工具类Arrays五、面向对象(上)1.一个类中常见的三种成员:构造器、Field和方法2.static修饰的成员不能访问没有static修饰的成员3.方法传递参数凡是只有一种:值传递。4.形参个数可变的方法,在最后一个形参的类型后增加三点.,表示该形参可以接受多个参数值,多个参数的值被当成数组传入。java view plaincopyprint?62 public class Varargs 63 64 /定义了形参个数可变的方法 65 public static void test(int a , String. books) 66 67 /books被当成数组处理 68 for (String tmp : books) 69 70 System.out.println(tmp); 71 72 /输出整数变量a的值 73 System.out.println(a); 74 75 public static void main(String args) 76 77 /调用test方法 78 test(5 , 疯狂Java讲义 , 轻量级Java EE企业应用实战); 79 80 5.重载:同一个类中包含了两个或两个以上方法的方法名相同,但是形参列表不同。方法返回值类型、修饰符等,与方法重载没有任何关系。可变参数方法重载时,优先选择不可变参数的方法。6.虽然类实例可以访问static Field,但是建议用类.StaticField来访问。7.访问控制权限。8.希望子类重写的方法,可以用protected修饰符9.父包中要使用子包中的类需要写成完整包路径加类名,使用import后可以直接使用类名。10.Java默认为所有源文件导入java.lang包下的所有类。11.import static 可以导入类的static Fieldjava view plaincopyprint?81 import static java.lang.System.*; 82 import static java.lang.Math.*; 83 84 public class StaticImportTest 85 86 public static void main(String args) 87 88 /out是java.lang.System类的静态Field,代表标准输出 89 /PI是java.lang.Math类的静态Field,表示常量 90 out.println(PI); 91 /直接调用Math类的sqrt静态方法 92 out.println(sqrt(256); 93 94 12.一旦提供了构造器,则不再使用默认的构造器,通常在提供构造器后要提供一个无参构造器13.几个构造器中与重叠代码时,可以用一个构造器通过this(x,y)调用另一个构造器java view plaincopyprint?95 public class Apple 96 97 public String name; 98 public String color; 99 public double weight; 100 public Apple() 101 102 103 /两个参数的构造器 104 public Apple(String name , String color) 105 106 = name; 107 this.color = color; 108 109 /三个参数的构造器 110 public Apple(String name , String color , double weight) 111 112 /通过this调用另一个重载的构造器的初始化代码 113 this(name , color); 114 /下面this引用该构造器正在初始化的Java对象 115 this.weight = weight; 116 117 14.子类包含与父类同名方法的现象被称为方法重写,重写要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同;“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或者相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;一大“,子类方法的访问权限应比父类方法更大或者相等15.父类中的private方法对子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法,即使子类中有相同的private方法,也不是重写16.子类Field定义了与父类Field同名成员变量,那么子类成员变量会覆盖父类成员变量,但是子类对象初始化时也会为父类成员变量分配存储空间,必须通过super访问17.子类构造器总会调用一次父类构造器,如果没有显示调用父类构造器,则调用默认的父类构造器,super显示调用父类构造器,必须放在子类构造器的第一行18.创建任何java对象总是先调用object类的构造器,自顶向下调用构造器19.Java引用变量有编译时类型和运行时类型两类,编译时类型由定义该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。编译时类型和运行时类型不一致,就可能出现所谓的多态性20.对象的Field并不具有多态性,总是访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field21.将父类引用强制转换成子类引用时,需要先用instanceof进行预判22.设计父类的原则:a.尽量隐藏父类的内部数据,多用private,不让子类直接访问父类;b.不要让子类可以随意访问、修改父类的方法,辅助方法用private,不希望改写用final,希望重写,不希望其他类访问,可以用protected。c.尽量不要在构造器中调用将要被子类重写的方法。java view plaincopyprint?118 class Base 119 120 public Base() 121 122 test(); 123 124 public void test() /号test方法 125 126 System.out.println(将被子类重写的方法); 127 128 129 public class Sub extends Base 130 131 private String name; 132 public void test() /号test方法 133 134 System.out.println(子类重写父类的方法, 135 + 其name字符串长度 + name.length(); 136 137 public static void main(String args) 138 139 /下面代码会引发空指针异常 140 Sub s = new Sub(); 141 142 当创建Sub对象时,先执行父类构造器,父类构造器调用了被子类重写方法,则变成调用被子类重写后的方法。即执行2号test方法,此时name Field是null23.使用final或者将构造器设置为private,则该类无法成为父类,对于后者可以提供静态方法以创建该类的实例24.当子类需要增加额外属性或者行为方式时,就使用继承25.初始化块是Java类的第四种成员(Field、方法和构造器),先定义的初始化块先执行,后定义的后执行,用表示,初始化块在构造器之前执行26.创建Java对象时,先为该对象的所有实例Field分配内存(前提是该类已经被加载过)接着成语开始对这些实例变量执行初始化,先执行初始化块或者声明Field时指定的初始值,在执行构造器里指定的初始值。java view plaincopyprint?143 public class InstanceInitTest 144 145 /为a分配内存,再执行初始化块将a Field赋值为6 146 147 a = 6; 148 149 /再执行将a Field赋值为9 150 int a = 9; 151 public static void main(String args) 152 153 /下面代码将输出9。 154 System.out.println(new InstanceInitTest().a); 155 156 27.将多个构造器中相同的代码提取到初始化块中定义,能更好地提高初始化代码的复用,提高整个应用的可维护性28.在存在继承关系中,先执行父类的初始化块,父类的构造器,再执行子类的初始化块和子类构造器29.静态初始化代码块使用static,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,静态初始化块总是比普通初始化块先执行。通常用于对类Field执行初始化处理,而不能对实例Field进行初始化处理。不能访问非静态的Field。静态初始化块也要上溯父类。java view plaincopyprint?157 class Root 158 159 static 160 System.out.println(Root的静态初始化块); 161 162 163 System.out.println(Root的普通初始化块); 164 165 public Root() 166 167 System.out.println(Root的无参数的构造器); 168 169 170 class Mid extends Root 171 172 static 173 System.out.println(Mid的静态初始化块); 174 175 176 System.out.println(Mid的普通初始化块); 177 178 public Mid() 179 180 System.out.println(Mid的无参数的构造器); 181 182 public Mid(String msg) 183 184 /通过this调用同一类中重载的构造器 185 this(); 186 System.out.println(Mid的带参数构造器,其参数值: 187 + msg); 188 189 190 class Leaf extends Mid 191 192 static 193 System.out.println(Leaf的静态初始化块); 194 195 196 System.out.println(Leaf的普通初始化块); 197 198 public Leaf() 199 200 /通过super调用父类中有一个字符串参数的构造器 201 super(疯狂Java讲义); 202 System.out.println(执行Leaf的构造器); 203 204 205 public class Test 206 207 public static void main(String args) 208 209 new Leaf(); 210 new Leaf(); 211 212 30.当JVM第一次主动使用某个类时,系统为在类准备阶段为该类的所有静态Field分配内存;在初始化阶段则负责初始化这些静态Field,初始化静态Field就是执行类初始化代码或者声明类Field时指定的初始值,他们的执行顺去与源代码中的排列顺序相同。java view plaincopyprint?213 public class StaticInitTest 214 215 /先执行静态初始化块将a静态Field赋值为6 216 static 217 218 a = 6; 219 220 /再执行将a静态Field赋值为9 221 static int a = 9; 222 public static void main(String args) 223 224 /下面代码将输出9。 225 System.out.println(StaticInitTest.a); 226 227 即先分配空间,再按排列顺序执行赋值。六、面向对象(下)1.=和equals,=用来判断两个对象是否相等(基本类型时,只要值相等,引用类型时,必须指向同一个对象),equals用于判断引用对象值是否相等,通常需要重写,默认的是比较对象的地址,String已经重写了2.final修饰的类、变量和实例变量不可改变。final修饰的类Field必须在静态初始化块中或声明该Field时指定初始值;实例Field必须在非静态初始化块、声明该Field或构造器中指定初始值。final变量必须初始化后才可以访问。final局部变量,只能初始化一次3.当final修饰基本类型变量,不能对基本类型变量重新赋值,但对于引用类型变量,只保证这个引用类型变量所引用的地址不会改变,即一直引用同意对象,但这个对象完全可以发生改变4.当类Field、实例Field或者局部变量使用了final修饰符,并且在定义该变量时指定了初始值,该初始值在编译时就被确定下来,那么就相当于是一个直接量(宏替换)java view plaincopyprint?228 public class FinalLocalTest 229 230 public static void main(String args) 231 232 /定义一个普通局部变量 233 final int a = 5; 234 System.out.println(a); 235 236 变量a其实并不存在,执行System.out.println(a)时转换为System.out.println(5)5.final修饰的方法不可被重写(不希望子类重写父类的某个方法),final修饰的类不能有子类6.创建不可变类的规则(类似与String,Double):使用private和final修饰符来修饰该类的Field;提供带参数构造器,用于根据传入参数来初始化类里的Field;仅为该类的Field提供Getter方法,不提供Setter方法;如果有必要,重写Object类的hashCode和equals方法,还要保证用equals判断相等的对象的hashCode也相等。java view plaincopyprint?237 public class Address 238 239 private final String detail; 240 private final String postCode; 241 /在构造器里初始化两个实例Field 242 public Address() 243 244 this.detail = ; 245 this.postCode = ; 246 247 public Address(String detail , String postCode) 248 249 this.detail = detail; 250 this.postCode = postCode; 251 252 /仅为两个实例Field提供getter方法 253 public String getDetail() 254 255 return this.detail; 256 257 public String getPostCode() 258 259 return this.postCode; 260 261 /重写equals方法,判断两个对象是否相等。 262 public boolean equals(Object obj) 263 264 if (this = obj) 265 266 return true; 267 268 if(obj != null & obj.getClass() = Address.class) 269 270 Address ad = (Address)obj; 271 / 当detail和postCode相等时,可认为两个Address对象相等。 272 if (this.getDetail().equals(ad.getDetail() 273 & this.getPostCode().equals(ad.getPostCode() 274 275 return true; 276 277 278 return false; 279 280 public int hashCode() 281 282 return detail.hashCode() + postCode.hashCode() * 31; 283 284 7.通过引用新的实例对象,就可以避免不可变类的引用类型的Field域被修改java view plaincopyprint?285 class Name 286 287 private String firstName; 288 private String lastName; 289 public Name() 290 public Name(String firstName , String lastName) 291 292 this.firstName = firstName; 293 this.lastName = lastName; 294 295 public void setFirstName(String firstName) 296 297 this.firstName = firstName; 298 299 public String getFirstName() 300 301 return this.firstName; 302 303 public void setLastName(String lastName) 304 305 this.lastName = lastName; 306 307 public String getLastName() 308 309 return this.lastName; 310 311 312 public class Person 313 314 private final Name name; 315 public Person(Name name) 316 317 = name; 318 319 public Name getName() 320 321 return name; 322 323 public static void main(String args) 324 325 Name n = new Name(悟空, 孙); 326 Person p = new Person(n); 327 / Person对象的name的firstName值为悟空 328 System.out.println(p.getName().getFirstName(); 329 / 改变Person对象name的firstName值 330 n.setFirstName(八戒); 331 / Person对象的name的firstName值被改为八戒 332 System.out.println(p.getName().getFirstName(); 333 334 修改代码为:java view plaincopyprint?335 public class Person 336 337 private final Name name; 338 public Person(Name name) 339 java view plaincopyprint?340 =new Name(name.getFirstName()name.getLastName(); java view plaincopyprint?341 342 public Name getName() 343 344 return newName(name.getFirstName()name.getLastName(); 345 346 public static void main(String args) 347 348 Name n = new Name(悟空, 孙); 349 Person p = new Person(n); 350 / Person对象的name的firstName值为悟空 351 System.out.println(p.getName().getFirstName(); 352 / 改变Person对象name的firstName值 353 n.setFirstName(八戒); 354 / Person对象的name的firstName值被改为八戒 355 System.out.println(p.getName().getFirstName(); 356 357 8.含有抽象方法的类只能被定义成抽象类(直接定义一个抽象方法;继承了一个抽象父类没有完全实现父类包含的抽象方法,以及实现了一个接口,但没有完全实现接口包含的抽象方法),final和abstract不能同时使用,static不能和abstract同时使用9.接口中不能包含普通方法,接口中所有方法都是抽象方法。一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。接口里可以包含Field(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口、枚举)定义。接口中的成员(包括常量、方法、内部类和枚举)都是public访问权限,可以省略public,如果指定访问修饰则只能用public。接口中的Field会自动添加static 和 final修饰符,即自动添加public static final,而且接口中没有构造器和初始化块,必须在定义时指定默认值。接口里的方法总是public abstract来修饰。接口里定义的内部类、接口、枚举类默认都采用public static 两个修饰符10.一个类可以继承一个父类,实现多个接口11.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类成员之间可以相互访问,但外部类不能访问内部类的实现细节12.内部类的文件形式,B是A的内部类,则会生成A.class和A$B.class13.外部类成员变量、内部类成员变量与内部类里方法的局部变量同名,则可通过使用this,外部类类名.this作为限定来区分。同过OutterCpName的形式访问外部类的实例Field,通过pName的形式访问非静态内部类的实例Fieldjava view plaincopyprint?358 public class DiscernVariable 359 360 private String prop = 外部类的实例变量; 361 private class InClass 362 363 private String prop = 内部类的实例变量; 364 public void info() 365 366 String prop = 局部变量; 367 /通过 外部类类名.this.varName 访问外部类实例Field 368 System.out.println(外部类的Field值: 369 + DiscernVp); 370 /通过 this.varName 访问内部类实例的Field 371 System.out.println(内部类的Field值: + p); 372 /直接访问局部变量 373 System.out.println(局部变量的值: + prop); 374 375 376 public void test() 377 378 InClass in = new InClass(); 379 (); 380 381 public static void main(String args) 382 383 new DiscernVariable().test(); 384 385 14.内部类也满足静态关系,即静态成员不能访问非静态成员,不允许在非静态内部类里定义静态成员15.static修饰的内部类,属于外部类本身,称为静态内部类。外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。java view plaincopyprint?386 public class AccessStaticInnerClass 387 388 static class StaticInnerClass 389 390 private static int prop1 = 5; 391 private int prop2 = 9; 392 393 public void accessInnerProp() 394 395 /System.out.println(prop1); 396 /上面代码出现错误,应改为如下形式: 397 /通过类名访问静态内部类的类成员 398 System.out.println(StaticInnerCp1); 399 /System.out.println(prop2); 400 /上面代码出现错误,应改为如下形式: 401 /通过实例访问静态内部类的实例成员 402 System.out.println(new StaticInnerClass().prop2); 403 404 16.接口中定义的内部类,默认使用public static 修饰17.在外部类以外使用非静态内部类:如果在外部类以外的地方访问内部类(包括静态和非静态),则内部类不能使用private访问控制权限,private修饰的内部类只能在外部类内部使用,对于使用其他访问控制符修饰的内部类,则能在访问控制符对应的访问权限内使用。java view plaincopyprint?405 OuterClass.InnerClass varName /在外部类意外定义内部类变量 在外部类以外的地方创建非静态内部类实例java view plaincopyprint?406 OuterInstan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年河北邯郸市肥乡区公开选聘农村党务(村务)工作者100名模拟试卷附答案详解
- 北京市中医院肝内胆管结石手术处理考核
- 北京市中医院慢性腹泻病因诊断思路考核试题
- 2025年河北雄安新区雄县卫健系统公开招聘专业技术人员71名模拟试卷附答案详解(典型题)
- 唐山市人民医院内分泌高血压病因筛查考核
- 秦皇岛市人民医院药物生产质量管理考核
- 大学课件兼职
- 2025年4月重庆市妇幼保健院部分岗位招聘考前自测高频考点模拟试题及完整答案详解
- 衡水市中医院小儿推拿技术专项技能考核
- 张家口市人民医院后勤人力资源调配与绩效考核方案
- 血源性传播疾病暴露后处理
- 2024年湖北省科学技术馆度招聘真题
- 《习作:缩写故事》教学课件
- DB44∕T 2418-2023 公路路堤软基处理技术标准
- 钻芯法检测混凝土强度技术规程JGJ-T384-2024
- 人货场的培训课件
- 图书馆寻宝活动方案
- 2025年广西专业技术人员继续教育公需科目(三)答案
- 护理低温烫伤课件
- 2025至2030LED电源行业产业运行态势及投资规划深度研究报告
- 搅拌站泵车管理制度
评论
0/150
提交评论