且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

再生与终结-初识属性覆盖与final | 带你学《Java面向对象编程》之四十一

更新时间:2022-05-22 23:49:41

上一篇:规则之间-方法覆写限制 | 带你学《Java面向对象编程》之四十
【本节目标】
通过阅读本节内容,你将了解到属性覆写的概念,并初步了解并使用final达到一些特殊场景的需求,学会使用final搭配static定义一个全局常量。

属性覆盖

当子类定义了与父类相同名称的成员时候就称为属性覆盖。
范例:观察属性覆盖

class Channel {
    String info = “www.mldn.cn” ;
}
class DatabaseChannel extends Channel {   //要进行数据库的连接
    String info = “HelloMLDN” ;     //名称相同
    public void fun() {
       System.out.println(super.info) ;     // www.mldn.cn
       System.out.println(this.info) ;       // HelloMLDN
    }
}
public class JavaDemo{
   public static void main(String args[]) {
       DatabaseChannel channel = new DatabaseChannel () ;
       channel.fun() ;
   }         
}

如果这个时候按照标准的开发属性进行了封装。这个时候实际上子类就和父类中的私有属性没什么关系了,即使名称一样,也只是相当于子类定义了一个新的属性而已。

class Channel {
   private String info = “www.mldn.cn” ;
   public String getInfo() {
       return this.info ;
   }
}
class DatabaseChannel extends Channel {   //要进行数据库的连接
   String info = “HelloMLDN” ;     //名称相同
   public void fun() {
       System.out.println(this.info) ;       // HelloMLDN
       System.out.println(super.getInfo()) ;     // www.mldn.cn
   }
}
public class JavaDemo{
   public static void main(String args[]) {
       DatabaseChannel channel = new DatabaseChannel () ;
       channel.fun() ;
   }         
}

面试题:请解释super与this的区别?

  • 在程序类中使用this表示先从本类查找所需要的属性或方法,如果本类不存在,则查找父类定义。如果使用super则表示不查找子类,直接查找父类;
  • this与super都可以进行构造方法的调用,但是this()调用的是本类构造,而super()是由子类调用父类构造,两个语句都必须放在构造方法的首行,所以不能够同时出现。
  • this可以表示当前对象。

final关键字

final在程序之中描述的是种终结器的概念,在Java里面使用final关键字可以实现如下的功能:定义不能够被继承的类、不能够被覆写的方法、常量。
范例:使用final定义不能被继承类

final class Channel {                 //这个类不能够有子类
}
class DatabaseChannel extends Channel {     //错误的
}

当子类继承父类之后实际上是可以进行父类中方法覆写的,但是如果不希望某一个方法被子类所覆写,就可以使用final来进行定义。
范例:定义不能够被覆写的方法

class Channel {                 //这个类不能够有子类
   public final void connect () {
   }
}
class DatabaseChannel extends Channel {     //错误的
   public void connect () {}
}

在有一些系统开发之中,可能使用1表示开关打开、使用0表示开关关闭,但是如果说现在要是直接操作0或者1,则会造成混乱。所以就希望可以通过一些名称来表示0或者1。在final关键字里面有一个重要的应用技术:可以利用其定义常量,常量的内容一旦定义则不可修改。
范例:使用final定义常量

class Channel {                 //这个类不能够有子类
   private final int ON = 1 ;       //ON就是常量
   private final int OFF =0 ;       //OFF就是常量
   public final void connect () {
       ON = 2 ;             //程序出错
   }
}

实际上常量往往都是公共的定义,所以为了可以体现出共享的概念,往往会使用一种全局常量的形式来定义,使用public static final来定义全局常量。

class Channel {                 //这个类不能够有子类
   public static final int ON = 1 ;       //ON就是常量
   public static final int OFF =0 ;       //OFF就是常量
}

在定义全局常量的时候每一个字母必须大写表示。
范例:观察一个程序代码

public class JavaDemo{
   public static void main(String args[]) {
       final String info = “mldn” ;
       String strA = “www.mldn.cn” ;
       String strB = “www. “+ info + “.cn” ;
       System.out.println(strA == strB) ;         //true
   }         
}

在方法的时候也可以使用final来定义参数,此时也表示一个常量的概念。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:教你从实战中领悟继承(上) | 带你学《Java面向对象编程》之四十二
更多Java面向对象编程文章查看此处