接口与多态

1.多态概念

什么是多态,大概就是A类,B类继承C类,写一个函数只接受C类型的参数,但是A类和B类也可以传过去。代码如下:

public class C {

	protected void print(){
		System.out.println(generateString());
	}
	
	protected String generateString(){
		return "this is C";
	}
}
public class B extends C{
	protected void print(){
		System.out.println(generateString());
	}
	
	protected String generateString(){
		return "this is B";
	}
}
public class A extends C{
	protected void print(){
		System.out.println(generateString());
	}
	
	protected String generateString(){
		return "this is A";
	}
	
	public static void print(final C c){
		c.print();
	}
	public static void main(String[] args) {
		print(new A());
	}
}
输出如下:

this is A

2.不能覆盖私有方法

public class C {

	protected void print(){
		System.out.println(generateString());
	}
	
	protected String generateString(){
		return "this is C";
	}
	
	private void printPrivate(){
		System.out.println("C:private");
	}
	
	public static void main(String[] args) {
		C c = new A();
		c.printPrivate();
	}
}
public class A extends C{
	protected void print(){
		System.out.println(generateString());
	}
	
	protected String generateString(){
		return "this is A";
	}
	
	public void printPrivate(){
		System.out.println("A:public");
	}
	
	public static void print(final C c){
		c.print();
	}
	public static void main(String[] args) {
		print(new A());
	}
}
输出如下:
C:private
也就是说本来A应该是覆盖C中的函数,但是现在反而是A被C覆盖了,但是这种情况不常见,很少有人会想在C类中调用他的继承类A的函数,正常的使用者都会把printPrivate的函数当成A类特有的,如果想调用这个函数,就不会向上转型了,而是直接
A a = new A()了

3.不能覆盖域

public class E {

	public int i = 1;
	public void print(){
		System.out.println(i);
	}
}
public class D extends E{

	public int i = 100;
	/*public void print(){
		System.out.println(i);
	}*/
	public static void main(String[] args) {
		E e = new D();
		e.print();
	}
}
输入如下:
1
这个特性其实很出人意料,但是正如java编程思想所说的那样,一般人不会这么用,所以有个记录就好了

4.static函数不会被覆盖

public class E {

	public int i = 1;
	public void print(){
		System.out.println(i);
	}
	public static void printStatic(){
		System.out.println("E class");
	}
}
public class D extends E{

	public int i = 100;
	/*public void print(){
		System.out.println(i);
	}*/
	public static void printStatic(){
		System.out.println("D class");
	}
	public static void main(String[] args) {
		E e = new D();
		e.printStatic();
	}
}
输出如下:
E class
静态方法是属于类的,不是对象,所以不会被覆盖

5.构造器中多态方法

当在基类G的构造函数中调用被子类F覆盖的函数print的时候,会发生什么事情?调用F的print?是的,这也确实是我们想得到的,但是却有着问题:
public class G {
	
	void print(){
		System.out.println("G");
	}
	
	G(){
		System.out.println("G()");
		print();
	}
}
public class F extends G{

	int i = 99;
	F(int i){
		this.i = i;
		System.out.println("F():" + i);
	}
	void print(){
		System.out.println("F:" + i);
	}
	
	public static void main(String[] args) {
		new F(100);
	}
}
输出如下:
G()
F:0
F():100
i变量在基类G构造的时候没有被初始化,所以是默认的值0,导致出现了以上的输出,这个我还没有遇到过类似错误,希望将来可以避免







相关内容:
前言
对象和类型
操作符和引用
流程控制语句
初始化和清理
访问控制
组合和继承
接口和多态
接口与抽象类
容器
异常
类型信息
泛型
数组
IO系统
枚举类型
注解
多线程
总结