public >protected>default>private
关于继承:
子类可以继承父类所有非私有成员变量和非私有成员方法,同名就覆盖。
父类的构造函数可以被继承但不能被覆盖(相当于final),子类先调用父类构造函数,再调用自己的构造函数
class Father{String name = "father";
public void play(){
System.out.println("i am playing cards");
}
}
}
public class Test {
public static void main(String[] args) {
Son s = new Son();
s.play();
System.out.println(s.name);
}
}
the output is:
i am playing cards
father
class Father{
String name = "father";
public void play(){
System.out.println("i am playing cards");
}
class Son extends Father{
String name = "son";
public void play(){
System.out.println("i am playing toys");
}
public class Test {
public static void main(String[] args) {
Son s = new Son();
s.play();
System.out.println(s.name);
}
}
i am playing toys
son
讲转型:
转型分为向上转型和向下转型。
向上转型就是将子类的对象赋给父类引用。
向下转型就是将父类对象赋给子类引用,但是向下转型必须先向上转才能向下转
//向上转
class Father{
String name = "father";
public void play(){
System.out.println("i am playing cards");
}
class Son extends Father{
String name = "son";
public void play(){
System.out.println("i am playing toys");
}
public class Test {
public static void main(String[] args) {
Father f = new Son();//向上转
f.play();
System.out.println(f.name);
}
}
the output is:
i am playing toys
father
//向下
class Father{
String name = "father";
public void play(){
System.out.println("i am playing cards");
}
class Son extends Father{
String name = "son";
public void play(){
System.out.println("i am playing toys");
}
public class Test {
public static void main(String[] args) {
Father f = new Son();//先向上
Son s = (Son) f;//再向下
s.play();
System.out.println(s.name);
}
}
the out put is:
i am playing toys
son
注意:不可以直接向下,虽然编译没有错,但是一运行就会报错
不想深刻理解就记住两句话:
1调用的成员变量和能够调用的方法由引用类型决定Father f = new Son();这里面的Father就是引用类型2调用哪个里面的方法由对象决定
向上转型和向下转型的优缺点:
向上转具有灵活性,可以在需要替换的时候改为其他子类,但是呢,它会遗失掉子类独有的方法。假如上述例子中son还有一个cry方法,调用时候就会不通过。
向下转的优缺点就反上啦~