前几日忙于面试题,重新回归JAVA
今天聊聊JAVA继承和多态,依旧是C++和JAVA 对比学习
一、JAVA方法的继承
这里假设的方法都是publc ,没有权限的问题。如果要考虑权限,还涉及到一个包的概念,下节再加以赘述。
首先在JAVA中只支持单继承,这一点和C++不一样。
此外C++默认的子类继承父类的成员函数和成员变量之后,若是子类有和其同名的成员变量和成员函数,他的机制是静态引用。(也就是在编译其间确定,根据引用类型决定)
JAVA有一点不同,它的子类是覆盖(override)父类的函数。所以他的方法引用是使用动态引用。(根据绑定的对象决定。)
贴code
class Fu
{
int x = 8;
Fu()
{
// super();
test();
return;
}
void test()
{
System.out.println("fu test"+x);
}
}
class Zi extends Fu
{
int x = 9;
Zi()
{
super();
test();
return;
}
void test()
{
System.out.println("zi tett"+x);
}
}
class Test
{
public static void main(String[] args)
{
Fu myfu = new Zi();
// System.out.println("t get the"+myfu.x);
}
}
output::zi test 0; zi test 9;
很明显,父类中调用的show() 方法是动态绑定了子类。
事实上, JAVA继承中函数的继承很类似于C++中虚函数的实现。
二、final 关键字
final 可以修饰类 方法 变量
final 修饰的类不可以被继承
final 修饰的方法不可以被覆盖
final 修饰的变量是一个常量,只能被赋值一次
短短的三句话概括了final的精髓。
和C++比较相似的是,JAVA修饰变量很类似于const
三、抽象类和抽象方法
c++ 里面有纯虚函数 java里面也有相关的机制,用abstarct 关键字实现
同样的类似于C++里面的多继承,JAVA是通过多接口的机制增加了一种保障。
还是贴Code
abstract class Person
{
abstract void show();
}
interface Walk
{
public abstract void walk();
}
interface Hello
{
public abstract void hello();
}
class ZhangLu extends Person implements Walk,Hello
{
public void show()
{
System.out.println("i can show");
}
public void walk()
{
System.out.println("i can walk");
}
public void hello()
{
System.out.println("i can hello ");
}
}
class Test2
{
public static void main(String[] args)
{
System.out.println("Hello World!");
ZhangLu zhang1 = new ZhangLu();
zhang1.show();
zhang1.walk();
zhang1.hello();
}
}
很明显地指出了JAVA中的多接口继承。
一些总结:
1、方法只有声明,没有实现时 该方法就是抽象方法,需要被abstract修饰
抽象方法必须定义在抽象类中,该类必须也被abstract修饰
2、抽象类必须由其子类覆盖了其***所有的抽象方法之后,否则该子类还是抽象类
3、抽象类可以不定义抽象方法,但是很少见,目的就是不让该类创建对象——AWT的适配器对象就是该类
4、抽象类可定义抽象方法,也可以定义非抽象方法
5、abstract 不能喝final private static 共存
6、接口(interface) 可以实现多继承。
所以说C++ 的多继承在JAVA处被变为了多接口的实现。