一、super 关键字
1.super理解为父类的
2.super可以用来调用属性方法构造器
3 super的使用: ①我们可以在子类的方法或构造器中,通过使用”super.属性”或“super.方法”的方法显式的调用父类中的声明属性或方法
②当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,必须显式的使用super.属性来表明调用的是父类中的属性
③当子类重写了父类中的方法以后,我们要想在子类中调用父类中声明的方法,必须显式的使用super.方法来表明调用的是父类中的方法
package exercise;
public class csdn
{
public static void main(String[] args)
{
Students s = new Students();
s.sysou();
s.eat();
}
}
class Person
{
int age = 15;
String name = "jim";
public void eat()
{
System.out.println("人吃饭");
}
}
class Students extends Person
{
int age = 20;
String name = "Tom";
public void eat()
{
System.out.println("学生多吃点有营养的");
super.eat();
}
public void sysou()
{
System.out.println("年龄是:"+ this.age+" 姓名是:"+this.name);
System.out.println("年龄是:"+ super.age+" 姓名是:"+super.name);
}
}
结果如下:
4 super调构造器
super()调用父类的构造器
①我们可以在子类的构造器中显式的使用“super(形参列表)”的方式调用父类中声明的指定的构造器。
②“super(形参列表)”的使用,必须声明在子构造器的首行
③我们在类的构造器中针对于“this(形参列表)”或者“super(形参列表)”只能二选一,不能同时出现
④ 在构造器的首行,没有显式的声明“this(形参列表)”或“super(形参列表)”则默认调用的是父类中的空参构造器。
⑤在类的多个构造器中至少有一个构造器中使用了“super(形参列表)”调用父类的构造器
二、子类对象实例化的过程
1.从结果上看(继承性) 子类继承父类以后就获取了父类中声明的属性和方法
2.从过程上来看:当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的构造器,直到调用了object类中的空参的构造器为止,正义屋内调用所有父类的构造器,所以才可以看到内存中父类的结构只有子类对象才可以考虑进行调用
说明:虽然创建子类对象时调用了父类的构造器,但自始至终只调用了一个对象
三、多态性
1.何为多态性:父类的引用指向子类的对象(或子类的对象赋给父类使用)。
2多态的使用:当调用子父类同名参数的方法时,实际执行的是子类重写父类的方法(虚拟方法调用)
3.有了对象的多态性以后我们在编译期只能调用父类声明的方法但在运行期我们实际执行的是子类重写父类的方法(编译看左边,运行看右边)
4.前提:
①要有类的继承关系
②要有方法的重写
(多态性只适用于方法,不适用于属性)
5.虚拟方法调用:(多态情况下)(动态绑定)(运行时行为)
子类中定义了与父类同名同参的方法下,将此时父类的方法称为虚拟方法,父类根据献给它不同的子类对象,动态调用属于子类的该方法,这样的方法调用在编译期是无法确定的
package exercise;
public class csdn
{
public static void main(String[] args)
{
Person p = new Students();
p.eat();
}
}
class Person
{
int age = 15;
String name = "jim";
public void eat()
{
System.out.println("人吃饭");
}
}
class Students extends Person
{
int age = 20;
String name = "Tom";
public void eat()
{
System.out.println("学生多吃点有营养的");
}
public void sysou()
{
System.out.println("年龄是:"+ this.age+" 姓名是:"+this.name);
}
}
四、向下转型:
1.有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用
2.向下转型
如何才能调用子类特有的属性和方法:向下转型(使用强制类型转换符:intsanceof)
3.instanceof关键字的使用:
a instancof A 返回 true,则 a intstnceof B也返回 true。(其中A是B的子类)