面对对象的super认识和this的区别

面对对象的多态

学习多态之前,先认识super:

  1. 假设关于继承的理解(示例):
  1. 目前理解的子类可以继承父类哪些东西 : 非私有的字段和方法【主要是从访问权限的角度,局限性】

  2. 看示例:做学生管理系统,需要登陆的功能: 涉及 ,学生账号,老师账号

都是账号有共同属性 account password 但是学生账号和老师账号都有独有的属性行为

  1. 类的设计

a) 设计一个用户类User : 包含: 用户名 密码 字段

b) 让学生类和老师类继承 User用户类

  1. 规范写法:User类中的用户名及密码字段应该私有化提供get set方法

  2. **问题:**父类User中的字段私有化,子类学生类和老师类能够继承到用户名和密码吗?

a. 从目前理解(主要是从访问权限来看),子类是继承不到私有成员的;

b. 是否应该在子类中再定义用±-

c. 户名和密码字段呢? 不应该!

d. 结论:子类对象中应该没有用户字段及密码字段可以存值

  1. 就按照上面的写法,验证子类中是否具有父类中的属性这样的一个特点

![img](file:///C:\Users\ljl\AppData\Local\Temp\ksohtml7444\wps2.jpg)

  1. 类设计: 账号类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

  1. 什么是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的使用场景

  1. **前提:**super访问父类的成员,都必须是在有访问权限的条件之下;

  2. 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 = 中花花
    
    1. 在子类的构造方法体第一句访问父类的构造方法;

      1. super(); 调用父类无参数的构造方法;

      2. super(123); 调用父类中具有一个int参数的构造方法;

  3. 特殊使用场景 :在子类的构造方法第一句,

a) 如果没有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法!

b) 如果有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法,就不存在了!

  1. 特殊使用场景结论:子类的构造方法中一定会调用到父类的构造方法特殊使用场景测试

    代码实现:

    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("小王八");
    	}
    
    1. 无论如何,子类的构造方法一定会存在对于父类构造方法的调用【难点:重在理解】

    a) 私有化字段在子类getset可以用到的原因

    b) javaBean为什么一定要提供一个无参数的构造方法

    super和this:

    1. this的概念:this表示当前对象,持有当前对象的地址

    2. 判断this当前对象是谁?

    a) 官方:this所在的函数正在被谁调用,this就指代谁

    b) 民间:this当前被哪个对象持有this就指代谁

    1. this的使用场景

    a) 通过this访问当前对象中的成员(字段,方法);区分成员变量与局部变量的二义性

    b) 把this(当前对象)看成是一个数据, 就可以作为值返回,作为参数传递…

    c) 使用场景-2 : 本类中构造方法的之间的方法体第一句相互调用;

    i. this(); 调用本类中无参数的构造方法;

    ii. this(123); 调用本类中具有一个int参数的构造方法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值