1. 其它关键字
1.1 this关键字
this关键字是当前实例化对象的引用,在方法或者构造器内部使用,它在方法内部使用,表示这个方法所属对象的引用;它在构造器内部使用,表示该构造器正在初始化的对象。this关键字可以调用类的属性、方法和构造器。
this关键字的使用说明:
- 在任意方法或构造器内,如果使用当前类的成员变量或成员方法可以在其前面添加this,
增强程序的阅读性。不过,通常我们都习惯省略this。 - 当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。
3.使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。
使用this关键字调用构造器的注意点:
3. 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
4. 明确:构造器中不能通过"this(形参列表)“的方式调用自身构造器
5. 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)”
6. "this(形参列表)“必须声明在类的构造器的首行!
7. 在类的一个构造器中,最多只能声明一个"this(形参列表)”
1.2 super关键字
super关键字指代父类对象的引用,在子类使用来调用父类的属性、方法和构造器,其使用方法和this关键字类似。
super调用父类的属性和方法:
- 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."
- 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
- 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。
super关键字调用父类中的构造器:
- 子类中所有的构造器默认都会访问父类中空参数的构造器
- 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
- 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错。
子类对象实例化过程:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,…直到调用了java.lang.Object类中空参的构造器为止。正因为加载过所的父类的结构,所以才可以看到内存中父类中的结构,子类对象才可以考虑进行调用。图示如下:
1.3 package关键字
package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:
package 顶层包名.子包名 ;
包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次;包通常用小写单词标识。通常使用所在公司域名的倒置。
包的作用:
- 包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
- 包可以包含类和子包,划分项目层次,便于管理
- 解决类命名冲突的问题
- 控制访问权限
JDK中主要的包介绍
1.4 关键字import
为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。语法格式为:
import 包名. 类名
使用import关键字注意点:
- 在源文件中使用import显式的导入指定包下的类或接口
- 声明在包的声明和类的声明之间。
- 如果需要导入多个类或接口,那么就并列显式多个import语句即可
- 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
- 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
- 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的
是哪个类。 - 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
- import static组合的使用:调用指定类或接口下的静态的属性或方法
1.5 static关键字
static关键字可以修饰属性、方法、代码块、内部类,表示该类独有的,所有的实例化对象共享一份。
staic修饰属性: 静态变量(类变量)
实例变量:我们创建了类的多个对象,每个对象都独立的拥一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
说明:
- 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
- 静态变量的加载要早于对象的创建。
- 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
内存解析
static修饰方法:静态方法(类方法)
① 随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
②
静态方法 非静态方法
类 yes no
对象 yes yes
③ 静态方法中,只能调用静态的方法或属性,非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
1.6 final关键字
final关键字用来修饰类、变量、方法,具体说明如下:
- final标记的类不能被继承。提高安全性,提高程序的可读性。如String类、System类、StringBuffer类。
- final标记的方法不能被子类重写。比如:Object类中的getClass()。
- final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。如:
final double MY_PI = 3.14;
2. javaBean
- JavaBean是一种Java语言写成的可重用组件。
- 所谓javaBean,是指符合如下标准的Java类:
- 类是公共的
有一个无参的公共的构造器- 有属性,且有对应的get、set方法
- 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关
心任何改变。
栗子:
public class JavaBean {
private String name; // 属性一般定义为private
private int age;
public JavaBean() {
}
public int getAge() {
return age;
}
public void setAge(int a) {
age = a;
}
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
}
3. Object类的使用
Object类是所有Java类的根父类, 如果在类的声明中未使用extends关键字指明其父类,则默认父类
为java.lang.Object类。Object类中定义所有通用的方法,但没有属性,这些通用的属性包括方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()/ wait()/ notify()/notifyAll()等。
equals()方法
说明:
- 是一个方法,而非运算符
- 只能适用于引用数据类型
- Object类中equals()的定义:
public boolean equals(Object obj) {
return (this == obj);
}
//说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
- 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
- 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.
重写的原则:比较两个对象的实体内容是否相同.
重写equals栗子
class User{
String name;
int age;
//重写其equals()方法
public boolean equals(Object obj){
if(obj == this){
return true;
}
if(obj instanceof User){
User u = (User)obj;
return this.age == u.age && this.name.equals(u.name);
}
return false;
}
}
4. 包装类的使用
为了使基本数据类型具有类的特征,故引入包装类,基本数据类型对应的包装类对象如下:
包装类、基本数据类型、String间的转换