注意:
1、如果是父类对象调用父类中的成员变量,即使是在多态这种情况下结果依然是输出父类的成员变量中的值,而不是子类成员变量中的值,因为子类并没有重写父类中的成员变量。
2、多态的情况下父类依然是不能调用子类中独有的成员方法和成员变量。
具体体现是:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
多态的弊端:不能使用子类的特有功能
Animal a = new Cat()
不能调用子类方法和子类属性
Animal a = new Cat()
Cat c = (Cat) a
可以调用子类方法和子类属性
public abstract class Animal{ // 抽象类
public abstract void run(); // 抽象方法
}
在Java中,一个没有方法体的方法应该被定义为抽象方法,而类中如果有抽象方法,则该类必须被定义为抽象类,抽象类中可以拥有非抽象方法。
抽象类不能被直接实例化,可以参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的子类:要么重写抽象类中的所有抽象方法,要么是抽象类。
接口用关键字interface来定义
public interface 接口名 {
// 常量
// 抽象方法
}
2、类实现接口用implements:
public class 类名 implements 接口名 {}
3、接口不能实例化 即不能new接口
接口如何实例化?参照多态方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象。
接口的实现类:要么重写接口中的所有抽象方法,要么是抽象类
4、接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化。
1、成员变量只能是常量即以public static final开头修饰的,如果没写则默认以public static final开头
2、构造方法:接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的
3、成员方法:只能是抽象方法即默认以public abstract开头即使不写也是以public abstract开头
1、成员区别:
2、关系区别:
3、设计理念区别:
1、内部类可以直接访问外部类的成员,包括私有成员;
2、外部类想要访问内部类的成员必须创建对象;
外部类.内部类 对象名 = new 外部类名().new 内部类名();
外部类.内部类 对象名 = new 外部类名.内部类名();
Employee a = new Employee() {
public void work() {"干自己的事情"}
};
a. work();
-----------------------------------------------------------
package com.scanner;
public class Demo {
public static void main(String[] args) {
new Test(){
@Override
public void test() {
System.out.println("测试");
}
}.test();
}
}
interface Test {
void test();
}
匿名内部类特点:
package com.scanner;
public class Demo {
public static void main(String[] args) {
test_anonymous_class(()->{
System.out.println("测试lambda和匿名内部类1");
});
// 光标放到Test上按下option+回车会提示用lambda替换掉匿名内部类
test_anonymous_class(new Test() {
@Override
public void test() {
System.out.println("测试lambda和匿名内部类2");
}
});
}
public static void test_anonymous_class(Test test){
test.test();
}
}
interface Test {
void test();
}