关键字
package
- package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。
- 语法格式:package 顶层包名.子包名 ;
- 包的作用
1.包帮助管理大型软件系统:将功能相近的类划分到同一个包中。
2.包可以包含类和子包,划分项目层次,便于管理。
3.解决类命名冲突的问题。
4.控制访问权限(public,protected,默认,private)。 - JDK中主要的包介绍
- java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
- java.net----包含执行与网络相关的操作的类和接口。
- java.io ----包含能提供多种输入/输出功能的类。
- java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
- java.text----包含了一些java格式化相关的类
- java.sql----包含了java进行JDBC数据库编程的相关类/接口
- java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
import
- 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。
- 语法格式:import 包名. 类名;
- 注意
- 在源文件中使用import显式的导入指定包下的类或接口。
- 声明在包的声明和类的声明之间。
- 如果需要导入多个类或接口,那么就并列显式多个import语句即可。
- 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
- 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
- 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
- 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
- import static组合的使用:调用指定类或接口下的静态的属性或方法。
this
- this 可以调用类的属性、方法和构造器
- 在方法内部调用,表示这个方法所属对象的引用;
在构造器内部调用,表示该构造器正在初始化的对象。 - 调用成员变量或成员方法注意
1.在任意方法或构造器内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性。不过,通常我们都习惯省略this。
2.当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。
3.使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。 - 调用构造器注意
1.this可以作为一个类中构造器相互调用的特殊格式。
2.可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器。
3.不能在构造器中通过"this(形参列表)"的方式调用自身构造器。
4."this(形参列表)"必须声明在类的构造器的首行。
5.在类的一个构造器中,最多只能声明一个"this(形参列表)"。
super
- super可用于调用父类中定义的属性,成员方法和构造器
- 注意
1.尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员。
2.super的追溯不仅限于直接父类。
3.子类中所有的构造器默认都会访问父类中空参数的构造器。
4.当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行。
5.如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错。
static
- 类属性、类方法的设计思想
类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。 - 使用范围:可用static修饰属性、方法、代码块、内部类
- 被修饰后的成员具备以下特点
1.随着类的加载而加载
2.优先于对象存在
3.修饰的成员,被所有对象所共享
4.访问权限允许时,可不创建对象,直接被类调用 - 注意
1.类变量(类属性)由该类的所有实例共享。
2.类变量在内存中存放在方法区。
3.在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
4.因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super。
5.static修饰的方法不能被重写。
final
在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。
- final标记的类不能被继承。提高安全性,提高程序的可读性。
eg.String类、System类、StringBuffer类 - final标记的方法不能被子类重写。
eg.Object类中的getClass() - final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只
能被赋值一次。final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值,然后才能使用。
eg.final double MY_PI = 3.14
native
- 原生的,内置的,是一个修饰符,只能修饰方法
- native修饰的方法,说明不是用Java语言实现的方法体,而是由C语言等其他语言实现的,用C语言实现后,编译为.dll文件,然后由Java代码调用
- 对于调用者来说,和普通方法一样,没有区别,该怎么调用就怎么调用,子类继承后如果需要重写,就可以重写。
eg.Object类中的hashCode方法,由native修饰,没有方法体。
public native int hashCode();
如下图所示,查看类的轮廓outline,可从每个方法前面的标识看出该方法的修饰符,绿色为public,黄色为protected,红色为private,右上角的角标为N代表native,角标为F代表final,角标为S代表static,角标为C代表构造器。
abstract
- 用abstract关键字来修饰一个类,这个类叫做抽象类。
用abstract来修饰一个方法,该方法叫做抽象方法。抽象方法只有方法的声明,没有方法的实现,以分号结束。eg.public abstract void eat(); - 注意
1)含有抽象方法的类必须被声明为抽象类。
2)抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
3)不能用abstract修饰变量、代码块、构造器。
4)不能用abstract修饰私有方法、静态方法、final的方法、final的类。即,用abstract进行修饰的方法,不能同时使用private,static,final,native修饰符。用abstract进行修饰的类,不能同时使用final修饰符,因为final表示不能被继承,abstract就是用来继承的。
原因:
private的方法在子类中不可见,无法重写。
static的方法不能被重写,并且static的方法直接用“类名.”调用,没有方法体执行。
final修饰的方法表示不能被重写。
native表示方法体由C语言实现,abstract表示无方法体,由子类实现。
5)抽象类的变量可以与子类的对象构成多态引用,执行子类重写的方法。 - 抽象类的应用:模板方式设计模式
模板:定好了框架,格式,结构。具体的内容需要使用者来填写。eg.简历模板,论文模板,请假条模板
在开发中,遇到这样的情况:当解决某个问题时,总体的代码结构是确定的,步骤也是确定的。只是其中一小步的具体步骤不确定,那么我们可以把这个不确定的步骤设计为抽象方法,让使用者实现它。
eg.计算一段代码的运行时间,其中(2)就可以设置成抽象方法,供使用者重写。
步骤:
(1)获取开始时间start
(2)执行准备计算时间的代码
(3)获取结束时间end
(4)计算时间差(end-start)
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
模板方法设计模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,比如常见的有:
1)数据库访问的封装
2)Junit单元测试
3)JavaWeb的Servlet中关于doGet/doPost方法调用
4)Hibernate中模板程序
5)Spring中JDBCTemlate、HibernateTemplate等
interface
接口(interface)就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系。接口的本质是契约,标准,规范。
接口(interface)是抽象方法和常量值定义的集合。
- 接口的特点:
1)用interface来定义。
2)接口中的所有成员变量都默认是由public static final修饰的。
3)接口中的所有抽象方法都默认是由public abstract修饰的。
4)接口中没有构造器。
5)接口采用多继承机制。 -
注意
1)定义Java类的语法格式:先写extends,后写implements
eg.class SubClass extends SuperClass implements InterfaceA{ }
2)一个类可以实现多个接口,接口也可以继承其它接口。
3)实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。
4)接口的主要用途就是被实现类实现。(面向接口编程)
5)与继承关系类似,接口与实现类之间存在多态性
6)接口和类是并列关系,或者可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义(JDK7.0及之前),而没有变量和方法的实现。
接口和抽象类的对比.png
在开发中,常看到一个类不是去继承一个已经实现好的类,而是要么继承抽象类,要么实现接口。
修饰符
1.权限修饰符(public,protected,缺省,private)
public/缺省:修饰类(包括内部类和外部类),方法,属性,构造器
protected/private:修饰内部类,方法,属性,构造器
2.static
修饰:内部类,方法,属性,代码块
3.final
修饰:类(包括内部类和外部类),方法,属性,局部变量
4.native
修饰:方法
注:构造器只允许权限修饰符修饰
局部变量只能final修饰