一.记录多态的学习
1.多态的概念:多种形态、多种状态。一个引用变量可以引用多个不同的对象。父类的引用可以指向子类的任意对象。
2.我对多态的理解:通过父类的引用代表任意子类的对象,通过父类的引用可以实现执行到子类中不同的方法,多态很多时候就是基于方法的重写来实现的。(父类引用调用的时候是使用父类方法实现调用,实现这个方法的时候是子类自己重写的方法。)
方法的重载也是一多态的体现,同样的代码,执行路径不一样也能体现多态。
3.下面引用一个简单的例子,加深自己对多态的理解。
package Java_0713;
public class Duotai {
public static void main(String[] args) {
GoodStudent 安逸 = new GoodStudent();
BadStudent 神秘的天 = new BadStudent();
/*Student 安逸 = new GoodStudent();
Student 神秘的天 = new BadStudent();
*/
安逸.study();
神秘的天.study();
}
}
class Student{
public void study() {
System.out.println("学习");
}
}
class GoodStudent extends Student{
public void study() {
System.out.println("掉头发学习");
}
}
class BadStudent extends Student{
public void study() {
System.out.println("美人在侧式学习");
}
}
GoodStudent 安逸 = new GoodStudent();
BadStudent 神秘的天 = new BadStudent();
安逸.study();
神秘的天.study();
安逸和神秘的天都是调用子类的study
Student 安逸 = new GoodStudent();
Student 神秘的天 = new BadStudent();
安逸.study();
神秘的天.study();
安逸和神秘的天被声明为父类Student,他们调用的方法是父类的study,但是在运行的时候都是子类的方法
4.转型
向上转型:子类转父类
向下转型:父类转子类
转的是对象的声明,不是对象本身
5.多态的细节总结
(1)成员变量:调用还是运行都是看左边
(2)成员方法:调用的时候看左边(声明);运行的时候看右边(new 对象)
当子类中没有的时候,会默认运行父类中的方法
(3)静态方法:调用还是运行都是看左边
(静态方法属于类,声明的是哪个类就属于哪个类)
下面提供一个小案例来总结以上知识
public class Duotaitest2 {
public static void main(String[] args) {
Y y = new Y();
y.printValue();//输出Y
X x = (X)y; //相当于X x = new Y();
y.printValue();//输出Y
x.printValue();//输出Y
x = new X();
x.printValue();//输出X
}
}
class X{
public void printValue() {
System.out.println("X");
}
}
class Y extends X{
public void printValue() {
System.out.println("Y");
}
}
二.final关键字
final代表最终的,不可变的
1.final变量
(1)final成员变量:在声明的时候必须给变量赋值(原因:成员变量有默认初始值0),声明和初始化是一个步骤。
(2)final局部变量:声明和初始化是两个步骤
(3)final引用类型变量:
2.final方法:该方法不可变,方法不能被重写
3.final类:该类不能被继承
String类是一个final,String字符串不可变。String a = “abc”,a = a+“c”;,指的是字符串常量池中abc不会变,在堆里面会生成abcc。(String类的不可变性)
三.抽象类和接口的关系(实现关系,多实现)
抽象类一定是父类
接口一定要被实现
抽象类:对具体的实体的抽象的提取。如门。
所有的子类应该符合抽象类的定义。
接口:对功能的扩展。
1.接口(interface):比抽象类还抽象的类。接口中的方法所有的方法都是抽象方法(默认且只能使用public&abstract修饰方法)。接口和类的关系是实现,implements,一个类要实现接口必须实现它所有的类,提供很多规则。
(1)接口成员的特点:
成员方法:默认且只能使用public&abstract修饰方法。
成员变量:默认使用 public static final 修饰成员变量。
(2)Collection<>接口:超级接口,具备所有集合功能的接口(集合是用来存储、删除数据的,下一个知识点再详谈。)
(3)接口的优点(模块化开发):
a.一个类可以实现多个接口。
b.解耦:降低了程序耦合性,提高开发效率。
c.对外提供接口。
2.接口和抽象类的区别:
共性:不断的抽取出抽象的概念。
区别1:与类的关系
类与接口是实现关系,而且是多实现,一个类可以实现多个接口。
类与抽象类是继承关系,Java中的继承是单一继承,也是多层继承,一个类只能继承一个类。
区别2:成员
成员变量:
抽象类可以有成员变量,也可以有常量。
接口只能有常量。
成员方法:
抽象类可以有抽象方法,也可以有非抽象方法。
接口只能有抽象方法,方法默认修饰符 public abstract。
构造方法:
抽象类有构造方法。
接口没有构造方法。