面对对象的多态
学习多态之前,先认识super:
- 假设关于继承的理解(示例):
-
目前理解的子类可以继承父类哪些东西 : 非私有的字段和方法【主要是从访问权限的角度,局限性】
-
看示例:做学生管理系统,需要登陆的功能: 涉及 ,学生账号,老师账号
都是账号有共同属性 account password 但是学生账号和老师账号都有独有的属性行为
- 类的设计
a) 设计一个用户类User : 包含: 用户名 密码 字段
b) 让学生类和老师类继承 User用户类
-
规范写法:User类中的用户名及密码字段应该私有化提供get set方法
-
**问题:**父类User中的字段私有化,子类学生类和老师类能够继承到用户名和密码吗?
a. 从目前理解(主要是从访问权限来看),子类是继承不到私有成员的;
b. 是否应该在子类中再定义用±-
c. 户名和密码字段呢? 不应该!
d. 结论:子类对象中应该没有用户字段及密码字段可以存值
- 就按照上面的写法,验证子类中是否具有父类中的属性这样的一个特点
![img](file:///C:\Users\ljl\AppData\Local\Temp\ksohtml7444\wps2.jpg)
- 类设计: 账号类User,学生账号类StudentUser,老师账号类TeacherUser
代码实现:
class User {
private String account;
private String password;
public void setAccount(String account) {
this.account = account;
}
public String getAccount() { //设计get set 方法 提供外部访问权限
return account;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
class StudentUser extends User {
}
class TeacherUser extends User {
}
}
测试一下:
public class Test_Jc {
public static void main(String[] args) {
StudentUser studentUser = new StudentUser();
studentUser.setAccount("唐三");
studentUser.setPassword("1372265573");
System.out.println("账号:"+studentUser.getAccount()+"\n"+"密码:"+studentUser.getPassword());
}
}
什么是super
- 什么是Super代码分析示例
//测试类
class Test {
public static void main(String[] args) {
StudentUser stu = new StudentUser();
stu.ma("灵动");
}
}
class User{
String name = "昊天";
}
class StudentUser extends User{
String name = "星云";
void ms(String name){
System.out.println("name = "+name);
System.out.println("this.name = "+this.name);
System.out.println("super.name = "+super.name);
}
}
super:在子类中表示父类的对象
super的使用场景
-
**前提:**super访问父类的成员,都必须是在有访问权限的条件之下;
-
super访问父类对象中的字段 及 普通方法;
class User{//父类User String name = "小花花"; void login(){ System.out.println("User login"); } } class StudentUser extends User{//子类 StudentUser String name = "中花花"; void eat(String name){ System.out.println("super.name = "+super.name);//super访问父类字段 super.login();//super访问父类普通方法 System.out.println("name = "+name); System.out.println("this.name = "+this.name); } } class Test {//有主方法的测试类Test public static void main(String[] args) { StudentUser stu = new StudentUser(); stu.eat("大花花"); } } ---------- Java ------------------------------------------------------ super.name = 小花花 User login name = 大花花 this.name = 中花花
-
在子类的构造方法体第一句访问父类的构造方法;
-
super(); 调用父类无参数的构造方法;
-
super(123); 调用父类中具有一个int参数的构造方法;
-
-
-
特殊使用场景 :在子类的构造方法第一句,
a) 如果没有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法!
b) 如果有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法,就不存在了!
-
特殊使用场景结论:子类的构造方法中一定会调用到父类的构造方法特殊使用场景测试
代码实现:
class User{ User(){ System.out.println("隐式无参父类User"); } User(String name){ System.out.println("显示有参式父类User"); } } class StudentUser extends User{ StudentUser(){//隐式调用父类的无参数的构造方法 System.out.println("隐式子类StudentUser"); } StudentUser(String name){//显示的写出隐式的调用就存在了 super(name); System.out.println("显示子类有参StudentUser"); } } //测试类 class Test { public static void main(String[] args) { System.out.println("----------隐式父类无参数构造方法调用---------"); new StudentUser(); System.out.println("----------显式父类有参数构造方法调用----------"); new StudentUser("小王八"); }
- 无论如何,子类的构造方法一定会存在对于父类构造方法的调用【难点:重在理解】
a) 私有化字段在子类getset可以用到的原因
b) javaBean为什么一定要提供一个无参数的构造方法
super和this:
-
this的概念:this表示当前对象,持有当前对象的地址
-
判断this当前对象是谁?
a) 官方:this所在的函数正在被谁调用,this就指代谁
b) 民间:this当前被哪个对象持有this就指代谁
- this的使用场景
a) 通过this访问当前对象中的成员(字段,方法);区分成员变量与局部变量的二义性
b) 把this(当前对象)看成是一个数据, 就可以作为值返回,作为参数传递…
c) 使用场景-2 : 本类中构造方法的之间的方法体第一句相互调用;
i. this(); 调用本类中无参数的构造方法;
ii. this(123); 调用本类中具有一个int参数的构造方法;