• 十六、Java基础之super



    一、super可以用在成员方法中,不能用在静态方法中;
    /*
    this是一个引用
    1.super不是引用类型,super中存储的不是内存地址,super指向的不是父类型对象
    2.super代表的是当前子类型对象中的父类型特征
    3.什么时候使用super?
    1.子类和父类中都有某个特征,例如:子类和父类中都有name属性
    如果在子类中访问父类中的name属性,需要使用super
    4.super可以用在什么地方?
    第一:super可以用在成员方法中,不能用在静态方法中;
    第二:super可以用在构造方法中(this重在构造方法中为:this())
    */

    例子1:Employee Manager Test
    //员工
    public class Employee {
    
        String name="小明";
    
        //成员方法
        public void work(){
            System.out.println("员工在工作!");
        }
    
    
    }
    public class Manager extends Employee {
        //子类将父类中的work方法重写的
        String name="小白";
        public void work(){
            System.out.println("经理在工作!");
        }
        public void m1(){
            this.work();//经理在工作
            work();//经理在工作
            super.work();//员工在工作
    
            System.out.println(this.name);//小白
            System.out.println(name);//小白
            System.out.println(super.name);//小明
        }
        //this和super相同,Error:(30, 28) java: 无法从静态上下文中引用非静态 变量 super
    //    public static void m2(){
    //        System.out.println(super.name);
    //    }
    }
    //测试
    public class Test01 {
    
        public static void main(String[] args){
            Manager m=new Manager();
            m.m1();
    
        }
    }

    二、super可以用在构造方法中(this在构造方法中为:this()//构造方法不能被继承

    //子类继承父类,会将父类中所有的方法继承过来,包括私有的,没办法直接访问私有的,但是可以通过get和set间接访问
    /*
    1.super关键字在构造方法中:
    语法:super(实参)-----this(实参)

    作用:通过子类中的构造方法去调用父类的构造方法

    语法规则:
    一个构造方法第一行执行如果没有this(...);也没有显示区调用super(...);
    系统会默认调用super()
    注意:super(...)的调用只能放在构造方法的第一个语句
    super()和this(...)不能共存
    super(...)调用了父类中的构造方法,但是并不会创建父类对象赋值
    java语言中只要是创建java对象,那么object中的无参数构造方法一定会执行,

    */
    例子2: Account debitAcciunt Test
    Account
    public class Account {
    
        //Field
        private String actno;
        private double balance;
    
        //Constructor
        public Account(){
            System.out.println("account中的无参数构造方法执行!");
        }
    
        public Account(String actno,double balance){
            this.actno=actno;
            this.balance=balance;
        }
        //setter和getter方法
        public void setActno(String actno){
            this.actno=actno;
        }
        public String getActno(){
            return actno;
        }
        public void setBalance(double balance){
            this.balance=balance;
        }
        public double getBalance(){
            return balance;
        }
    }
    debitAcciunt
    public class debitAccount extends Account{
    
        //Field
        //独特属性
        private double debit;
    
        //Constructor
        public debitAccount(){
            //super();//调用的父类的无参数构造方法
            super("001",1000);
        }
        public debitAccount(String actno,double balance,double debit){
            //通过子类的构造方法去调用父类的构造方法,作于是:给当前子类对象中的父类型特征赋值
            super(actno,balance);
            this.debit=debit;
        }
    
        //setter getter
    
        public void setDebit(double debit){
            this.debit=debit;
        }
        public double getDebit() {
            return debit;
        }
    }

    Test

    public class Test{
    
        public static void main(String[] args){
    
            debitAccount d=new debitAccount();
        }
    }

    三、单例模式的缺点

    单例模式的缺点:
    1.构造方法私有化
    2.单例模式的类型无法被继承
    3.单例模式的类型没有子类,无法被继承
    //编译不会通过
    public class Test02 {
        //Constructor
        private Test02(){}
    }
    
    class A extends Test02{
    
    }
    //编译可通过
    public class Test02 {
        //Constructor
        public Test02(){}
    }
    
    class A extends Test02{
    
    }
     
     
     


    public class Account {

    //Field
    private String actno;
    private double balance;

    //Constructor
    public Account(){
    System.out.println("account中的无参数构造方法执行!");
    }

    public Account(String actno,double balance){
    this.actno=actno;
    this.balance=balance;
    }
    //setter和getter方法
    public void setActno(String actno){
    this.actno=actno;
    }
    public String getActno(){
    return actno;
    }
    public void setBalance(double balance){
    this.balance=balance;
    }
    public double getBalance(){
    return balance;
    }
    }
  • 相关阅读:
    <mvc:default-servlet-handler />说明
    sql server 数据库创建链接服务器访问另外一个sql server 数据库
    WebSocket实现简易聊天室
    WebSocket在建立连接时通过@PathParam获取页面传值
    Shiro密码处理
    Java enum应用小结
    Java8 Optional类使用小结
    Java中使用Jedis操作Redis
    前台图片Canvas压缩上传小结
    剪邮票
  • 原文地址:https://www.cnblogs.com/chushujin/p/10087339.html
Copyright © 2020-2023  润新知