访问修饰符
public | protected | defauat | private | |
---|---|---|---|---|
同一类中 | YES | YES | YES | YES |
同一包中(子类与其他类) | YES | YES | YES | |
不同包的子类 | YES | YES | ||
不同包的无关类 | YES |
重写是两个类, 重载是一个类
抽象类
关键字abstract 抽象方法,只抽取方法声明,不抽取方法主体。 抽象类不能实例化,抽象方法没有主体,不能运行 使用:定义类继承抽象类,将抽象方法重写;或者匿名内部类实现。
public abstract class 父类 {
//声明,抽象方法必须存在于抽象类中
public abstract void work();
}
// 子类必须重写父类所有的抽象方法
public void work(){
} ### 接口
类不能多继承,但是接口可以多继承。 接口的实现类 接口依赖实现类,可以多重实现,因为接口的抽象方法只是声明,必须实现类自己去实现,或者匿名内部类实现
多态
多态离不开继承,父类指针指向子类变量 类的多态,接口的多态,抽象类的多态 父类指针调用方法走的是子类方法,但是编译的时候父类必须要有,否则编译不通过 调用成员变量,是父类的变量
多态向下转型就是强转,向上转型是默认的向上。
final关键字
- final修饰类不可以被继承,但是可以继承其他类。
- final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
- final修饰的变量不能被改变,成为常量
- final修饰的引用变量,内存地址不能被改变
-
final修饰的成员变量,必须手动赋值,或者构造方法赋值
class Fu { // final修饰的方法,不可以被覆盖,但可以继承使用 public final void method1(){} public void method2(){} } class Zi extends Fu { //重写method2方法 public final void method2(){} }
static关键字
- 被static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量)
- 可以直接被类名调用
- 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
- 同一个类中,静态方法中,只能访问静态成员变量或静态成员方法
- 在多态中,非静态编译看父类,运行看子类,父类没有编译失败。
- 但多态中的静态方法,编译看父类,运行仍然看父类。因为静态和对象没有关系,属于静态绑定。
匿名对象
-
匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。
public class Person{ public void eat(){ System.out.println(); } } 创建一个普通对象 Person p = new Person(); 创建一个匿名对象 new Person();
- 创建匿名对象直接使用,没有变量名。
- 匿名对象在没有指定其引用变量时,只能使用一次。
- 匿名对象可以做参数和返回值。
成员内部类
- 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
- 匿名内部类的本质是一个实现了接口或继承了某个类的子类匿名对象.
- 匿名内部类,使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成。虽然是两个步骤,但是两个步骤是连在一起完成的。
匿名内部类
* A: 匿名内部类案例演示
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
测试代码
/*
* new Animal(){
public void eat(){
System.out.println("在吃饭");
}
public void sleep(){
System.out.println("在睡觉");
}
};
以上代码,就是Animal的子类的对象
多态性, 父类引用 = 子类的对象
*/
public class Test2 {
public static void main(String[] args) {
Animal a= new Animal(){
public void eat(){
System.out.println("在吃饭");
}
public void sleep(){
System.out.println("在睡觉");
}
};
a.eat();
a.sleep();
}
}