目录
Java 面向对象(OOP)关键字
包package和import
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用
-
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
-
2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
-
3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
包的使用
Java中常用的包
开发者可以自己把一组类和接口等打包,并定义自己的包。而且在实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。
由于包创建了新的命名空间(namespace),所以不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。
this super
this用于指代当前对象;super用于指代父类对象。
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
this三大作用:
this调用属性、调用方法、this是自身的一个对象,代表对象本身。
引用构造函数
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
this()表示调用另外一个构造器,super()表示调用父类中的某个构造器,()中的参数决定调用的是哪个构造器。
package extend;
public class Main0 extends ss {
public Main0() {
super(2); //必须在构造函数的第一行 调用就近父类的构造方法,参数决定是父类的那个构造方法
System.out.println("调用ss方法!");
}
public static void main(String[] args) {
// ss a = new ss(2);
Main0 aa = new Main0();
System.out.println("asdaff");
}
}
class ss {
int a;
public String ss(String s) {
String a = "aaaaaa" + s;
System.out.println("调用ss方法!父类");
return a;
}
public ss(int a) {
this.a = a;
System.out.println("调用ss有参构造方法!" + a);
}
public ss() {
System.out.println("调用父类ss无参构造方法");
}
}
/*
小知识点:
class dd extends ee{
public dd(int a) {//必须要写的构造器
super(a);//必需调用有参的
}
}
class ee{
public ee(int a){
}
}
*/
final
package extend;
public class Final {
public static String A="abc";
public static void main(String[] args) {
final Final a = new Final(); //被final修饰的引用变量 a,
System.out.println(A);//输出 a的旧内容
a.A="ddd";
System.out.println(A); //输出 a的新内容
System.out.println(a); //a的地址不变
}
}
静态static关键字
静态方法
- 当类加载完毕会自动优先处理static属性和static块,这两个优先级是相同的,所以谁在前先处理谁;
- new对象时,处理非静态属性和非静态块,这两个优先级是相同的,所以谁在前先处理谁 ;
- 最后执行构造器。
父类中定义的静态方法(类方法)可以通过”子类名.静态方法名”的方式进行调用。
父类中定义的静态方法(类方法)可以在子类中进行覆盖定义(重写)。
加载顺序为先父后子---先执行父类中定义的静态属性和静态块。
然后执行父类初始化操作---先处理父类中的成员属性和非静态块,再执行父类构造器;最后执行子类的定义内容。
package extend;
public class JingTai extends AA {//加载父类static代码块,在加载子类static代码块 类加载时期完成
static {
System.out.println("输出子类静态代码块。");
}
{
System.out.println("输出子类非静态代码块。");
}
public JingTai() {
System.out.println("调用子类构造方法。");
}
public static void main(String[] args) { // 子类静态方法
AA a = new AA(); //创建父类对象
System.out.println();
JingTai aa = new JingTai(); // 创建子类对象,先创建父类对象调用父类非静态代码块,父类构造方法
}
}
class AA {
static { // 静态代码块
System.out.println("输出父类AA静态代码块的内容!");
}
{ // 非静态代码块
System.out.println("输出父类AA非静态代码块内容。");
}
public AA() {
System.out.println("调用父类构造方法。");
}
}
输出结果:
输出父类AA静态代码块的内容!
输出子类静态代码块。
输出父类AA非静态代码块内容。
调用父类构造方法。输出父类AA非静态代码块内容。
调用父类构造方法。
输出子类非静态代码块。
调用子类构造方法。