- 2.1 构造器(构造方法)
- 2.2 继承
- 多态
- 动态绑定
- instanceof 运算符
- 转换对象
- 方法重写
- 2.3 类成员
- 2.4 final 终极类 终极方法 常量
- 终极类
- 终极方法
- 常量(终极变量)
- 2.5 抽象
- 抽象类
- 抽象方法
- 2.6 接口
- 接口回调 ???
- 2.7 内部类 封装类
- 成员类
- 若开发者自定义了构造器,那么最好包含一个空的构造方法
- 在类的成员方法中访问成员变量可以用this指明访问的成员:this.member
- Java只允许单重继承
多态性 是指同一名字的若干个方法,有不同的实现。通过重载和重写实现的
动态绑定动态绑定机制:假设对象object是类C1,C2,…,Cn-1和Cn的实例,其中,C1是C2的子类,C2是C3的子类,…,Cn-1是Cn的子类,如果对象object调用一个方法m,Java虚拟机依次在类C1,C2,…,Cn-1,Cn中查找方法m的实现,直到找到为止(即 从子类向超类查找)
instanceof 运算符instanceof:用于判断对象是否是某类的示例,Object instanceof Class
转换对象超类引用可以指向子类对象:SuperClass object = new ThisClass();
方法重写- 重写:子类不需要从超类继承来的方法,可以使用相同的方法名,定义自己适用的方法
- 对于重写的同名方法,子类方法的访问权限要比超类方法的访问权限更松
- 子类如果想使用已被重写的超类方法,可以使用super关键字来调用
- 若在子类的构造器中需要调用超类的构造器,则调用语句一定要在子类构造器的第一行
- 静态变量(类变量):static关键字标记的变量
- 静态方法(类方法):static关键字标记的方法
- final:用final修饰的变量、方法、类不能被改变;类似C和C++中的const关键字
终极类:被final关键字标记的类
final class FinalClassName { ... }
- 终极类不能被继承,不能有子类
- 终极类的成员方法被默认设置为终极方法
终极方法:被final关键字标记的方法;终极方法不能被重写
常量(终极变量)- final 通常和 static 修饰符一起使用来创建类常量,该变量一旦赋值后,不能被重新赋值
- 被 final 修饰的实例变量必须显式指定初始值;
- final方法能被继承,不能被子类重写
抽象类:类中没有包含足够的信息来描绘一个具体的对象,Java中用 abstract class 定义抽象类
abstract class AbstractClassName { ... }
- 抽象类不能被实例化,必须被非抽象子类继承后才能使用
- 抽象类中可以有非抽象方法和抽象方法,而包含抽象方法的类一定是抽象类
抽象方法:抽象类包含的特别的成员方法,该方法的具体实现由它的子类确定
public abstract <返回值类型> AbstractMethod(...) {};
- 抽象类中的抽象方法只是声明,不包含方法体,不给出方法的具体实现功能
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
- 如果所有子类都具有某方法,并且该方法在不同子类中实现代码不同,一般做法是将该方法设置为超类的抽象方法
在面向对象设计中,Interface接口 表示 功能
接口中的方法成员被默认设定为public abstract类型
public interface InterfaceName {
void Method(); //等同于public abstract void Method();
}
- 接口的数据成员一定要赋初值(即只能有常量)
- 接口的方法成员一定要被非抽象的实现类实现(一个类声明实现一个接口,但没有重写接口中的所有方法,则这个类是抽象类)
Java中,接口回调是指 可以把实现某接口的类的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法
2.7 内部类 封装类在一个类或接口内部声明的类,包括:成员类,局部类,匿名类
成员类成员类是在封装类或封装接口中作为成员声明的类
- 非静态成员类:
- 不能定义静态变量和方法
- 可以访问封装类的所有成员
- 访问重名的封装类成员:封装类名.this.成员名;
- 访问不重名的封装类成员,可以直接通过成员名进行访问
- 在封装类外创建非静态成员类的对象时,需要先创建封装类的对象,然后用封装类名.非静态成员类名 变量名=封装类对象名.new 非静态成员类名(); 来创建非静态成员类实例
public class EnclosingClass {
static String name="EnclosingClass"; //静态成员变量
int x = 5, y = 6; //非静态成员变量
public void print1() { System.out.println("封装类的非静态方法"); }
static public void print2() { System.out.println("封装类的静态方法"); }
// 非静态成员类(不能定义静态成员变量和方法)
class MemberClass1{
String name="MemberClass1";
int x;
public void display() {
// 1)访问成员类的成员变量
System.out.println("MemberClass1.name="+name);
x = y; //直接使用封装类的成员变量名
System.out.println("MemberClass1.x="+x);
// 2)访问封装类的静态变量和方法
System.out.println("EnclosingClass.name="+EnclosingClass.name);
EnclosingClass.print2();
// 3)访问封装类的非静态变量和方法
System.out.println ("EnclosingClass.this.x="+EnclosingClass.this.x);
EnclosingClass.this.print1();
}
}
public static void main(String[] args) {
//创建封装类实例
EnclosingClass ec=new EnclosingClass () ;
//在封装类之外创建非静态成员类实例
EnclosingClass.MemberClass1 emc=ec.new MemberClass1();
emc.display();
}
}
- 静态成员类:
- 静态成员类中既可以定义静态成员,也可以定义非静态成员
- 静态成员类中能直接访问封装类的所有静态成员,但不能直接访问封装类的非静态成员
- 访问重名的封装类成员:封装类名.封装类静态成员名;
- 访问不重名的封装类成员,可直接通过成员名进行访问
public class EnclosingClass {
String name = "Tom";
static int x = 765;
public String getString() { return this.name;}
static class MemberClass {
String name = "Cat";
static int x = 432;
public static void show() {
//System.out.println("MemberClass.name="+name); //类的静态方法不能访问该类的非静态成员
System.out.println("MemberClass.x="+x);
//System.out.println("EnclosingClass.name"+EnclosingClass.name); //静态成员类中不能直接访问封装类的非静态成员
System.out.println("EnclosingClass.x="+EnclosingClass.x); //静态成员类中能直接访问封装类的所有静态成员
}
public void show2() {
System.out.println("MemberClass.name="+name);
System.out.println("MemberClass.x="+x);
//System.out.println("EnclosingClass.name"+EnclosingClass.name); //静态成员类中不能直接访问封装类的非静态成员
System.out.println("EnclosingClass.x="+EnclosingClass.x);
}
}
}



