JAVA实战开发经典已经看了好多遍,时间久了很快一本书就返完了,基础的已经了然于胸,但仍然有一些重点知识点在这里做笔记,强调一下!
一、switch语句
在Java中switch后的表达式的类型只能为以下几种:
byte 、short、char、int; JDK1.5之后,也支持枚举类; JDK1.7后支持了对String的判断。
注意:long不能作为switch的参数。
二、逻辑运算符,为什么会有两种与和或的操作?
与分为短路与“&&”和非短路与“&”,或分为短路或“||”和非短路或“|”。
对于与来说,要求所有的条件都判断,而如果使用短路与,第一个条件又为false,则后面的条件将不再判断。
对于或来说,要求所有的条件都判断,而如果使用短路或,第一个条件又为true,则后面的条件将不再判断。
三、数据的声明与分配内存
数据类型 数组名[] = null; //声明一维数组
数组名=new 数据类型[长度]; //分配内存给数组
或 数据类型 数组名[] = new 数据类型[个数]
数组声明后实际上是在栈内存中保存了此数组的名称(实际上是保存对一堆内存的引用地址),接下来便要在堆内存中配置数组所需要的内存。
堆栈内存的解释:数组操作中,在栈内存中保存的永远是数组的名称,只开辟了栈内存空间的数组是永远无法使用的,必须有指向的堆内存才可以使用,要向开辟新的堆内存则必须使用关键字new,然后只是将此堆内存的使用权交给了对应的栈内存空间,而且一个堆内存空间可以同时被多个栈内存空间所指向。
二维数组的声明格式:
数据类型 数组名[][];
数组名 = new 数据类型[行的个数][列的个数];
注意:Java中允许二维数组中每行的元素个数均不相等。
四、方法的定义
Java中方法定义的完整格式:
访问权限{public|default|protected|private} [final] [static] [synchronized] 返回值类型|void 方法名称(参数类型 参数名称,...)[throws Exception|,Exception2] {
[retrun [返回值|返回调用处]];
}
方法的重载就是 方法名称相同, 但参数的类型和参数的个数不同。 通过传递参数的个数及类型的不同可以完成不同功能的方法调用。
注意:方法的重载一定只是在参数上的类型或个数有所不同。
五、面向对象的基础概念
主要有封装性、继承性、多态性3个主要特性。
封装性有两个含义:一是指把对象的属性和行为看成一个密不可分的整体;另一层含义指“信息隐蔽”。
封装机制在程序设计中表现为,把描述对象属性的变量及实现对象功能的方法合在一起,定义为一个程序单位,并保证外界不能任意更改其内部的属性值,也不能任意调动其内部的功能方法。封装机制的另一个特点是,为封装在一个整体内的变量及方法规定不同级别的“可见性”或访问权限。
继承性:被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。根据继承机制,派生类继承超类的所有成员,并相应的增加自己一些新的成员。
面向对象程序设计中的继承机制大大增强了程序代码的可复用性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序的修改扩充提供了便利。(单继承,多继承;JAVA单继承)
多态性:多态是允许程序中出现重名的现象。JAVA中含有方法重载和对象多态两种形式的多态。
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行相互转换,而且根据使用的子类的不同,完成的功能也不同。
对象的创建及使用: 类名 对象名称 = null; 对象名称 = new 类名();
所用对象名称都在栈内存中保存,而对象的具体内容则则保存在对应的堆内存中,必须使用关键字new才能开辟堆内存空间,在堆内存中保存着对象的属性信息。
构造方法:在面向对象程序中构造方法的主要作用是为类中的属性初始化。
构造方法的名称必须与类名称一致。构造方法的声明处不能有任何返回值类型的声明。不能在构造方法中使用return返回一个值。
构造方法也是可以重载的,只是每个构造方法的参数类型或参数个数不同。
匿名对象就是没有明确给出名称的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
static关键字:全局属性(静态属性)、类方法。 使用static声明的属性和方法可以由类名称直接调用,static属性是所有对象共享的,所有对象都可以对其进行操作。
注意:非static声明的方法可以去调用static声明的属性或方法,但是static声明的方法是不能调用非static类型声明的属性或方法的。
如果需要限制类对象的产生,则可以将构造方法私有化。
代码块:代码块是指用{}括起来的一段代码,根据位置及声明关键字的不同,代码块可以分为普通代码块、构造块、静态代码块、同步代码块 4种。
普通代码块:指直接在方法或是语句中定义的代码块。
构造代码块:直接写在类中的代码块。
构造块优先于构造方法执行,而且每次实例化对象时都会执行构造块中的代码,会执行多次。
静态代码块:使用static关键字声明的代码块。
静态代码块优先于主方法执行,而在类中定义的静态代码块会优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
内部类的唯一好处就是可以方便地访问外部类中的私有属性。
用static定义内部类:用static声明的内部类变成了外部类,但是用static声明的内部类不能访问非static的外部类属性。
在外部访问内部类: 外部类.内部类 内部类对象 = 外部类实例.new 内部类();
在方法中定义内部类:在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数要想被内部类所访问,则参数前必须加上final关键字。
六、面向对象高级篇
继承:Java中只允许多层继承,而不能多重继承。即在Java中只允许单继承,不能使用多重继承,即一个子类只能继承一个父类。但是允许进行多层继承,即一个子类可以有一个父类,一个父类还可以有一个父类。
子类是不能直接访问父类中的私有成员的,子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
子类对象的实例化过程:在继承的操作中,对于子类对象的实例化也是有要求的,即子类对象在实例化之前必须首先调用父类中的构造方法后再调用子类自己的构造方法。
方法的覆写:所谓的方法覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
当方法被覆写后子类对象调用的方法将是被覆写后的方法。如果现在要在子类的方法中访问父类的方法,则使用super关键字即可。
属性的覆盖:如果子类和父类声明了相同名称的属性,则在子类中直接访问时一定是采用“就近访问原则”,即先找到本类中的属性,如果此时要调用父类中的属性,直接使用“super.属性”格式即可。
super关键字的作用:使用super关键字可以从子类中调用父类中的构造方法、普通方法和属性。
final关键字:使用final声明的类不能有子类;使用final声明的方法不能被子类所覆写;使用final声明的变量即成为常量,常量不可以修改。
抽象类的基本概念:抽象类的定义及使用规则如下:包含一个抽象方法的类必是抽象类;抽象类和抽象方法都要使用abstract关键字声明;抽象方法只需要声明而不需要实现;抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法。
接口的基本概念:接口是由全部常量和公共的抽象方法所组成。需要注意的是,在接口中的抽象方法必须定义为public访问权限,这是绝对不可改变的。 一个类可以同时实现多个接口,那么这实际上就摆脱了Java的单继承局限。
在Java中是允许一个抽象类实现多个接口的;但一个接口是不允许继承抽象类的,但是允许一个接口继承多个接口。
对象的多态性:多态性在面向对象中是一个最重要的概念,在Java中主要有以下两种提现形式:(1)方法的重载和覆写。 (2)对象的多态性。
对象的多态性主要分为以下两种类型:(1)向上转型:子类对象——>父类对象 (2)向下转型:父类对象——>子类对象。 对于向上转型,程序会自动完成,而对于向下转型时,必须明确地指明要转型的子类类型。
注意:在进行对象的向下转型前,必须首先发生对象向上转型,否则将出现对象转换异常。
instanceof关键字:在Java中可以使用instanceof关键字判断一个对象到底是哪个类的实例,格式如下:
对象 instanceof 类 ——> 返回boolean类型
由于通过子类实例化的对象同时也是子类和父类的实例,所以可以直接进行向上或向下转型,但如果直接使用了父类实例化本类对象,则一定就不再是子类实例了,所以是不能转型的。
内部类的扩展:实际上在一个抽象类中也可以定义多个接口或抽象类,在一个接口中也可以定义多个抽象类或接口。
抽象类与接口之间的关系:
在类的设计中,一定要明确记住一个原则,一个类不要去继承一个已经实现好的类,只能继承抽象类或实现接口,如果接口和抽象类都可以使用,那么悠闲使用接口,避免单继承局限。
Object类:在Java中所有的类都有一个公共的父类Object,一个类如果没有明显地继承一个类,则肯定是object类的子类。Object类中的主要方法:
public Object();
public boolean equals(Object obj);
public int hashCode();
public String toString();
实际上对于一个设计良好的类来说,最好覆写Object类中的equals()、hashCode()、toString() 3个方法。
注意:Object类提供的equals()方法默认是比较地址的。
接收任意引用类型的对象:既然Object类是所有对象的父类,则所有的对象都可以向Object进行转换,在这其中,也包含了数组和接口类型,即一切的引用数据类型都可以使用Object进行接收。
匿名内部类:在Java中除了内部类之外,还有一种匿名内部类。匿名内部类就是指没有一个具体名称的类,此概念在接口和抽象类的应用上发展起来的。匿名内部类的作用是可以利用内部类创建不具有名称的对象,并利用它访问类中的成员。
异常的捕获及处理:
异常是导致程序中断的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行。在Java中一切的异常都秉着面向对象的设计思想,所有的异常都以类和对象的形式存在,除了Java中已经提供的各种异常类外,用户也可以根据需要定义自己的异常类。
异常的最大父类是Throwable,其分为两个子类,分别为Exception和Error。Exception表示程序处理的异常,可以直接用try...catch...处理。Error表示JVM错误,程序中无法处理。
注意:Java中所有捕获范围小的异常必须放在捕获范围大的异常之前,否则程序在编译时就会出现错误提示。发生异常后,JVM会自动产生一个异常类的实例化对象,并匹配相应的catch语句中的异常类型,也可以利用对象的向上转型关系直接通过Exception捕获全部异常。
throws用在方法声明处,表示本方法不处理异常。throw表示在方法中手工抛出一个异常。
自定义异常类时,只需要继承Exception类即可。