1. 上转型对象
1.是什么? 子类的对象赋给了父类对象,例如 Jk_Father j= jk; 其中,j 就是上转型对象 ,上转型之后 ,j 这个对象 不能访问子类中新增的属性和方法,所以它能调用的属性和方法都是父类中原有的,如果子类覆盖或重写了由父类继承下来属性和方法,则调用的是覆盖或重写之后的值,总的来说,上转型的效果相当于 子类对象不能访问自己新增的属性和方法了,其他正常。
package test1;
public class Jk extends Jk_Father{
int workyear=12;
int leval =23;
@Override
public void work() {
System.out.println("工作了"+workyear+"年");
System.out.println(age);
}
public void playGame() {
System.out.println("play games ");
}
public static void main(String[] args) {
Jk jk = new Jk();
Jk_Father j= jk;
j.work();
j.leval;//不能调用新增的属性和方法和方法
j.playGame();//不能调用新增的属性和方法和方法
}
}
上转型之后还可以进行下转型,下转型之后就还是子类的对象了,可以访问子类中任何属性和方法
Jk jjkk =(Jk)j;
jjkk.playGame();
但是父类直接下转型到子类是不行的。只有像上面这样,由子类上转型成父类对象,然后再下转型回子类对象可以,其他情况不行
Jk_Father jf = new Jk_Father();
Jk k = (Jk)jf;
k.playGame();
出现的错误:
java.lang.ClassCastException: test1.Jk_Father cannot be cast to test1.Jk
at test1.Jk.main(Jk.java:29)
2.多态
多态分为 静态多态性 和动态多态性。
Java实现多态有三个必要条件:继承、重写、向上转型。
在Java中有两种形式可以实现多态:继承和接口
1.静态多态性指的就是重载,重载的概念就是 一组方法 ,它们的方法名相同,但是参数列表不同,参数列表不同的情况有,参数的个数不同,参数的数据类型不同,和参数的数据类型的排列顺序不同。这里对返回值类型不做考虑。
2.动态多态性指的就是重写 override, 重写的定义就是子类对父类继承下来的方法做了修改,覆盖了父类继承下来的方法,重写的方法的方法和父类的方法方法名,参数列表一样,而且要求访问范围应该一样或者更广,比如父类是proteceted的,那么子类重写后应该至少默认,甚至public 访问控制符的范围 依次是 public, protected, default, private
下面这个就是多态 Jk_Father jf = new Jk(); 在下面的代码中有。其实归根到底还是一个上转型对象,不能调用新增方法和属性,一旦你重载了父类的方法,这个方法就是子类新增的方法了,这是上转型对象就不能访问了。很正常。另外,你去访问重写后的方法时,当然是访问的是重写之后地方法。
package test1;
public class Jk extends Jk_Father{
int workyear=12;
public int leval=23;
public void work(int leval) {//这是重载
System.out.println("工作了"+workyear+"年");
System.out.println(leval);
}
/*public void work() {//这是重写
System.out.println("工作了"+workyear+"年");
}*/
public void playGame() {
System.out.println("play games ");
}
public static void main(String[] args) {
Jk_Father jf = new Jk();
jf.work();
}
}
3.异常
分为检查时异常和运行时异常,检查时异常我们必须处理,用try catch 去捕获异常,要么用throws 去抛出异常,运行时异常我们也可以不处理,系统会自动捕获异常
这次的变量命名不太好,下次会改进的!!
最后贴一个自己觉得写的更好的一篇博客: https://www.cnblogs.com/chenssy/p/3372798.html