1、第一章1. Java语言拼写是大小写敏感的(Case-Sensitive);2. 一个源文件中可以定义多个Java类,但其中最多只能有一个类被定义为Public类;3. 如果源文件中包含了public类,那么源文件必须和该public类同名;4. 一个源文件包含多个Java类时,编译后会生成多个字节码文件,即每个类都会生成一个单独的”.class”文件,且文件名与类名相同。Java中的名称标准:包名:多单词组成时所有字母都小写 xxxyyyzzz类名接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
2、 XxxYyyZzz常量名:所有字母都大写。多单词时每个单词用下划线连接。 XXX_YYY_ZZZ文档注释 格式:/*注释文字*/对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式表达的该程序的说明文档。/*这是我的HelloWorld程序。author小强*/所有的byte型、short型和char的值将被提升到int型。System,out.println(a)System,out.println(,a,+1)前者:a后者:98第二章函数中只能调用函数,不可以在函数内部定义函数。重载的概念在同一个类中,允许存在一个以上的同名
3、函数,只要它们的参数个数或者参数类型不同即可。重载的特点:与返回值类型无关,只看参数列表。intadd(intx,inty)returnx+y;intadd(intx,inty,intz)returnx+y+z;doubleadd(doublex,doubley)returnx+y;)逻辑运算符用于连接布尔型表达式,在JaVa中不可以写成3x3&x3*2*2=12右移31=1-3/2=1无符号右移31=1-3/2=1&与运算6&3=2I或运算6I3=7A异或运算63=5反码6=-7位运算是直接对二进制进行运算。ScannerStr=newScanner(System.in);bytexz=By
4、te();SCanner类的作用是获取控制台的输入信息(SCanner.in),反应到Str。importJAVA时间格式:importJava.util.*;publicclassTestDatepublicstaticvoidmain(Stringargs)Datetoday=newDate();SimpIeDateFormatf=newSimpleDateFormat(yyyy年MM月dd日hh:mm:ssM);Stringtime=f.format(today);System.out.println(time);)格式里的时如果用hh表示用12小时制,HH表示用24小时制F月份中的星期
5、E星期中的天数JaVa中M2表示n和2进行异或。求一个数的平方,可以n*n;或Math.pow(n,2);java.Iang包在预编译时已自动导入单类型导入有助于提高编译速度其中aReleaseVersionw是发行版,wIntegrationVersionw是集成版,两版下的rtUpdateSite是在线安装连接,“ZippedUpdateSite”手动安装包,用于本地自己安装。我们一般选择优化了的“ReleaseVersion31400.0doublef2=314e-2;/314*10(-2)3.14没有后缀F/f的浮点数值默认为double类型。浮点数都有舍入误差,不能在内存中精确表示所
6、有小数。0.If与doubleb=1.010不想等。所以,慎用比拟。Java,math下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。字符型 前面说过,JaVa用UniCOde编码,所以Char用来表示在UniCode中的字符。Unicode占2个字节,具有从O到65535之间的编码,u0000,至uFFFF,之间的16进制表示。ASCII码就是Unicode编码表中前128个字符。 再就是转义字符:CharC2=n;代表换行符 char也可直接当作正数来
7、用。intc=a,+2;输入c,为99.Boolean类型占1位直接用if(变量),if(!变量)形式判断true,false转换的时候,默认转换,是从“小”类型到大”类型。此处大小是指类型的表示范围,比方从Iong像float转换。而反过来,比方CharC3=5;虽然5在Char的表示范围内,但这是从int像Char类型的转换,必须强制转型,否那么输出错误。强转超范围的时候就会截断。当有类型提升的时候要强制转型:floata=1.0f;doubleb=3.23;floatc=(float)(a+b);大数溢出,注意先转型再计算。JDK7新特性intb=1_2312_3131;我们很容易就知道
8、这是1亿2312万3131.byteb=0000_0111;2023-07-111 .所有变量、方法、类名:见名知意2 .类成员变量、局部变量、方法名:首字母小写和驼峰原那么:monthsalary4 .常量:大写字母和下划线:MAX_VALUE5 .类名:首字母大写和驼峰原那么:Man,GoodMan三目运算符:intflag=x0?1:(x=0?0:-1);位运算:inti=14;int12=i3;/i/2/2/2eclipse快捷键a)命令提示:alt+/(main,syso)b)文件选择:i. Shift+上下左右,home,end键ii. Ctrl+Shift+左右单词选中c)删除一
9、行:ctrl+dd)复制一行到下面或上面:CtrI+alt+上下e)换行:all+上下f)编辑文件切换:ctrl+F6,或者CtrI+E,上下g)视图切换:ctrl+F7h)查看错误建议:ctrl+1i)导入类:ctrl+shift+oj)重命名:alt+shift+rSWitCh(表达式)case值1:语句序列;break;case值2:语句序列;break;default:默认语句;)case标签必须是整数(byte,short,char,int)或者枚举,JDK7.0可以使用字符串!。当需要先循环一次再判断的时候,记得还有do-whiIe可以用。打印九九乘法表”在for条件0内声明的变量
10、在整个for循环内都有效。对Java来说唯一用到标签的地方是在循环语句之前。不能频繁使用,注重代码可读性。outer:for(inti=101;i150;i+)for(intj=2;ji/2;j+)if(i%j=0)continueouter;)System,out.print(i+);JaVa中只有值传递。根本类型传递的是该数据值本身。引用类型传递的是对对象的引用。2023-7-12为什么需要package?1、解决类之间的问题。2、为了便于管理类,适宜的类位于适宜的包。importjava.util.*;导入该包下所有的类。会降低编译速度,但不会降低运行速度。如果导入两个同名的类,只能用
11、包名+类名来显示调用相关类:java.util.Datedate=newjava.util.DateO;staticimport静态导入(JDK1.5后增加,了解!):importstaticjava.lang.Math.PI;导入Uath类的PI属性然后,我们可以在程序中直接使用:System.out.println(PI);面向对象:以类的方式组织代码,以对象的方式封装数据栈:1 .每个线程私有,不能实现线程间的共享!2 .局部变量放置于栈中。3 .栈是由系统自动分配的连续空间,速度快,后进先出。堆:L放置new出来的对象!4 .堆是一个不连续的内存空间,分配灵活,速度慢!方法区(也是堆)
12、L被所有线程共享!2.用来存放程序中永远不变或唯一的内容:类代码信息、静态变量、字符串常量引用类型的概念1. java中,除了根本数据类型之外的其他类型称之为引用类型。2. java中的对象是通过引用来操作的。(引用:reference).说白了,引用指的就是对象的地址!JVM内存分析:内存分析期不翻D栈(三动分程连缮的H间,后送先出)堆:放Hnwdl的对象/javaPolV在此处加载Poly到方法区。常量池是共享的。publicclassPolypublicstaticvoidmain(Stringagrs)1、查找方法区内有没有StUdent类的信息,没有的话,加载2、加载代码,包括属性
13、和方法;StatiC变量;常量,常量也是对象3、在栈中创立栈帧,创立SI4、把new出来的Student对象放在堆中,初始化属性值Studentsi=newStudent();name的地址是常量池中高琦的地址si.name=高琦;si.age=18;C信息在堆上,c名字在栈上,指向堆上的地址,设为address】Computerc=newComputer();c.brand=”联想”;c.CpuSpeed=100;Sl在堆上数据中,COmPIlter地址也指向addresslsiputer=c;System.out.println(siputer.brand);没有被使用的对象,就是垃圾。1
14、 .程序员无权调用垃圾回收器。2 .程序员可以通过SyStem.gc().通知GC运行,但是JAVA标准并不能保证立刻运行。3 .finalize方法,是JAVA提供应程序员用来释放对象或资源的方法,但是尽量少用。重载:1、参数的类型、个数、顺序不同,构成重载。2、只有返回值不同,不构成重载。(只有返回值不同,在调用的时候,无法区分到底调用哪一个)STATIC1、StatiC声明静态成员变量,是类的公用变量,在类被载入时被显示初始化。2、StatiC声明静态方法,在静态方法中不能访问非StatiC成员3、直接通过,类名.属性;类名.方法名来调用Static,当然也可以通过对象调用。如下列图所示
15、在类初始化的时候,static变量和方法也进入了方法区。其中static方法指向类代码中相应的代码地址。当对象在堆中创立时,不包含StatiC元素,因为如上所说,StatiC元素一个类只有份,是公用的。因为StatiC方法先于对象而存在,所以不能使用this、SUPer关键词。2023-7-13this相当于隐含参数,相当于publicStudent(this)普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。无论有没有调用this,this总是传过去的。类中方法的代码是放在方法区共享的,所以调用方法的对象时需传参以区分不同的对象。this还有一个特
16、殊用法:在一个构造器中调用另一个构造器。例如,publicStudent(Stringname,intid)this();必须位于第一句this.name=name;this.id=id;publicStudent()System.out.printin(y1构造函数”);)用this调有参的另一个构造函数publicStudent(Stringname,intid)this(50);this.name=name;this.id=id;publicStudent(intage)this.age=age;面向对象三大特征:封装(encapsulation)继承(inheritance)多态(Po
17、IynlOrPhiSm)继承的优点:类是对对象的抽象,继承是对某一-批类的抽象(OODDesign),从而实现对现实世界更好的建模(00AAnalysisJo提高代码的复用性(OOPProgramming)o子类继承父类,得到父类的全部属性和方法(父类的构造方法除外)。没有手动继承的类,全部是默认extendsObjeCt类。重载是指一个方法名可以对应多个方法。重写指子类对从父类继承来方法的重新定义。重写与重载没有关系。重写toString方法:因为所有类都是Object的直接或间接子类,所有都可以重写Object的方法。重写方法不能使用比被重写方法更严格的访问权限。(由于多态)2023-7-
18、14SUPer是直接父类对象的引用,通过SUPer访问父类中被子类覆盖的方法或属性。除了Object类之外其他所有类的构造方法第一句总是super();任何类的构造方法中,假设是构造方法的第一行代码没有显式的调用super();那么JaVa默认都会调用super();this和SUPer只能在方法中用,方法隐含传递了这两个参数:eat(this,super)由图看出,首先main方法中,创立newBridO时,首先调用Bird构造方法中的SUPer(),SUPer指向直接父类Aninla1,在AninlaI中第一句话也是调SUPer,再指向直接父类Objeet。构造的时候是层层包裹的,首先是O
19、bject对象中所有属性和方法(Object的构造函数结束)Animal中增加或重写的属性或方法(Animal构造函数结束)Bird中的(Bird构造函数结束)。在Bird中调用某个方法时,也是逐层的找,比方,调用run。,在Bird中重写了,直接用Bird中的;可如果是toString。,就逐层往上找,一直找到ObjeCt中。继承和组合共同点:都可以实现代码的复用不同点:is-a关系使用继承;has-a关系使用组合publicclassAnimal2Stringeye;publicvoidrun()SySteniout.printIn(跑跑!,);)publicvoideat()SyStem
20、out.printin(吃吃!);)publicvoidsleep()System.out.printIn(zzzzz);)publicAnimal2()SyStem.out.printIn(创立一个动物!);)publicstaticvoidmain(Stringargs)Bird2b=newBird2();b.run();b.animal2.eat();)classMammal2Animal2animal2=newAnimal2();publicvoidtaisheng()System.out.printin(我是胎生,);)classBird2Animal2animal2=newAni
21、mal2();publicvoidrun()animal2.run();System.out.printIn(“我是一个小小小小鸟,飞呀飞不高);)publicvoideggSheng()System.out.PrintIr(“卵生”);)publicBird2()System.out.println(建一个鸟对象,);)控制台:创立一个动物!建一个鸟对象跑跑!我是一个小小小小鸟,飞呀飞不高吃吃!final关键字修饰变量-一分常量修饰方法:不能被重写,可以被重载。修饰类:修饰的类不能有子类,不能被继承。比方Math、String总之,被final修饰后就是最终态。封装:实现“高内聚,低耦合。高
22、内聚就是类的内部数据操作细节自己完成,不允许外部干预;低耦合:仅暴露少量的方法给外部使用。(1)对于PUbliC修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。(2)对于protected修饰符,它主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。(3)对于default来说,有的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用PrOteCted修饰的成
23、员也可以。(4)对于PriVate来说,它的访问权限仅限于类的内部,是一种封装的表达,例如,大多数的成员变量都是修饰符为PriVate的,它们不希望被其他任何外部的类访问。假设要在其他包访问,只能是PUbIic。多态1.多态是方法的多态,属性没有多态性。2 .编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。但是如果两个没有关联的类进行强制转换,会报:ClasscastExceptiono比方:本来是狗,我把它转成猫。就会报这个异常。3 .多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象例子如下:publicclassAnimalStri
24、ngstr;publicvoidvoice()SyStem.out.Println(普通动物叫声!);)classCatextendsAnimalpublicvoidvoice()SyStem.out.println(喷嘴哺);publicvoidcatchMouse()System.out.println(K);classDogextendsAnimalpublicvoidvoice()SyStem.out.printIn(汪汪汪);publicvoidseeDoor()SyStem.out.println(看门!,);classTigerextendsAnimalpublicvoidvoi
25、ce()System.out.println(哇哇哇”);classPigextendsAnimalpublicvoidvoice()SyStem.out.printIn(哼哼哼”);publicclassTestpublicstaticvoidtestAnimalVoice(Animalc)c.voice();/instanceof判断是否是实例对象还需要(Cat)C强转,因为编译器所限if(cinstanceofCat)(Cat)c).catchMouse();)publicstaticvoidmain(Stringargs)Animala=newCat();Animalb=newDog(
26、);Animalt=newTiger();testAnimaLVoice(a);testAnimaLVoice(b);testAnimaLVoice(t);必须强制把a转换成Cat,不转的话,编译器只会按Animal处理,找不到Cat的方法Cata2=(Cat)a;a2.catchMouse();为什么需要强制转换类型?引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。这时,我们就需要进行类型的强制转换!3一个父类的引用类型变量可以“指向”其子类的对象。3一个父类的引用不可以访问其子类对象新增加的成员(属性和方法)。3可以使用引用变量instanceof类名来判断该引用型变量所“指向
27、的对象是否属于该类或该类的子类。3子类的对象可以当作基类的对象来使用称作向上转型(UPCaSting),反之称为向下转型(downcasting)内存图:Animala=newCat();Cata2=(Cat)a;testAnimalVoice(a);深入内存分析:一个包下面三个类。publicclassHttpServletpublicvoidservice()System.out.printIn(HttpServlet.service();this.doGet();publicvoiddoGet()System.out.println(HttpServlet.doGet();publicc
28、lassMyServletextendsHttpServletpublicvoiddoGet()System.out.println(MyServlet.doGet();publicclassTestpublicstaticvoidmain(Stringargs)HttpServlets=newMyServlet();s.service();s.service();调用的肯定是HttPSerVIet里面的SerViCe()方法,那么此时的doGet(),是调用哪一个?调用UyServIet里面的!原因:MyServle对象在创立的时候,构造函数第一句是super(),直到调到ObjeCt()是
29、没错的,所以每层super都指向上层,当调用到子类没有的方法时,向上找;但是每个函数中的this指向的地址相同:当前对象。所以,HttpServlet定义的SerViCe()方法里,this.doGet(),this指向的是s本身,而s最外层,MyServlet()就有ClOGet()方法了,所以调用的是MyServIet()里面的。抽象方法:只声明了方法,同时使用了abstract修饰,没有方法体!必须要子类来重写!抽象类:包含抽象方法的类,必须设计成抽象类!1、抽象类中子类必须要重写抽象的方法,所以提供了一个父类模版。2、抽象类不能实例化,及不能用new来实例化抽象类。3、虽然抽象类不能实
30、例化,但可以有构造方法,只是构造方法只能被子类来继承。4、抽象方法必须被子类实现。在接口中定义的常量,默认是PUbIiCstaticfinalo无论是否注明,都是此属性。接口中定义的方法,无论是否写明都是PUbIiCabstract的。如果接口A多继承了接口B、C,那么实现A的类要实现ABC中的方法。抽象类和接口的意义:设计和实现的别离接口也可以父类引用指向子类对象:Flyablea=newStone();FlyabIe是接口,StOrIe是继承接口的类,但是a只能引用FlyabIe里的方法和属性接口名字可以以I开头,IMyFrame顾名思义,这是一个接口回调:publicclassPaint
31、FramepublicstaticvoiddrawFrame(IMyFramef)System.out.PrilTtIn(启动线程,);SyStenl.out.printIn(增加循环);SyStem.out.println(查看消息栈”);画窗口f.paint();System.out.println(启动缓存,增加效率”);publicstaticvoidmain(Stringargs)drFrne(newGameFrame01();classGameFrameOlimplementsIMyFrame0Overridepublicvoidpaint()System.out.println(
32、GameFrame01.paint();SyStem.out.println(画窗口”);classGameFrame02implementsIMyFrameOverridepublicvoidpaint()System.out.println(GameFrame2.paint();System.out.printin(IjSO);51内部类内部类就是在一个类中定义的类,innerclass内部类作用:1、内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。2、内部类可以直接访问外部类的私有属性。内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。3、普通
33、内部类寄宿在外部类对象中,必须先创立外部类对象。静态内部类存在,其外部类对象不一定存在,所以静态不能访问外部类普通属性,但是能直接访问外部类静态的属性方法。Face.Nosenose=newFace().newNose();Facef2=newFace();Face.Nosenose2=f2.newNose();什么时候该用内部类?某个类只为另一个类提供效劳,应优先设为内部类。String每个用双引号括起来的字符串都是String类的一个实例。String原码PublicfinalclassStringimplementsjava.io.Serializable,Comparable,Char
34、Sequence*Thevalueisusedforcharacterstorage.*/privatefinalcharvalue;初始化,构造器重载publicString()this,value=,.value;publicString(Stringoriginal)this.value=original.value;this.hash=original.hash;重载的方法很多finalA,A指向的地址不可变,但该地址储存的值可变。String就是Char数组,但是JaVa没有提供改变其值的方法,所以值不可变。Stringgh=newString(a);for(inti=0;i3;i+
35、)gh=gh+i;)内存图:Stringgh=newString(,a);这一句创立了两个对象,常量a和gh指向的VaIUea这样创立对象非常浪费空间,防止这样的代码。字符串类常用的方法:ncharcharAt(intindex)返回字符串中第index个字符。nbooleanequals(Stringother)如果字符串与Other相等,返回truenbooleanequalsIgnoreCase(Stringother)如果字符串与Other相等(忽略大小写),那么返回truenintindexf(Stringstr)IastIndexOfOnintindexf(Stringstr,in
36、tfromlndex)返回与Str匹配的第一个字串的开始位置,该位置从0或fromlndex开始计算,如果原始串中不存在Str,返回T.nintIengthO返回字符串的长度。nStringreplace(charoIdChar,charnewChar)返回一个新串,它是通过用newChar替换此字符串中出现的所有OIdChar而生成的nbooleanStartsWith(Stringprefix)如果字符串以PrefiX开始,那么返回truenbooleanendsWith(Stringprefix)如果字符串以PrefiX结尾,那么返回truenStringsubstring(intbeginlndex)nStringsubstring(intbeginlndex,intendindex)n返回一个新字符串,该串包含从原始字符串beginlndex到串尾或endindex-1的所以字符nStringtoLowerCase()返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母nStringtoUpperCase()返回一个新字符串,该串将原始字符串中的所有小写字母