封装的实现,得益于访问控制符的使用。
类的属性一般使用private
访问权限,然后提供属性相应的get/set
方法来对相关属性赋值与读取。而这些get/set
方法则使用public修饰,以便于外界调用。
通常情况下,只用于本类的辅助性方法用private
修饰,希望其他类调用的方法用public
修饰。
值得注意的是 boolean 变量的 get 方法需要使用 is 开头!
Java 中的类只有单继承(接口有多继承),在定义一个类的时候可以使用关键字 extends 指定它的父类。子类继承父类,就可以得到父类(除了构造方法)的全部属性和方法,但仍然不可以直接访问父类的私有属性和方法。
如果定义一个类时没有使用 extends,那么它的父类是:java.lang.Object
。
子类可以重写父类的方法,在调用这个方法时,子类重写后的方法会直接替换掉父类对应的方法。但是方法的重写必须遵循几个原则:
下面苏轻就介绍两个经常会去重写的方法!
苏轻经常使用==
来判断两个数是否相等,这在处理基本类型的数据时很实用。但是在遇到引用类型时,情况有所变化。
如果==
的两边是引用类型(对象,比如两个字符串),==
会去判断它们的地址是否相同。也就是说这时即使它们(这两个字符串)的内容可能完全相同,只要它们不是指向同一个地址,它们就不相等。于是,在所有类的基类Object
类中,定义有一个equals()
的方法,为我们提供了定义“对象内容相等”的逻辑。
JDK
提供的一些类,如String
类、Date
类、包装类等,都已经重写了Object
类的equals
方法。调用这些类的equals
方法,例如:x.equals(y)
,当x
和y
所引用的对象是同一类对象且属性内容相等(可以不是同一个对象)时返回true
,否则返回false
。
在Object
类中还定义有一个toString()
方法,在打印或用字符串连接对象时,就会自动调用该对象的toString()
方法。所以我们就可以去重写这个方法,来自定义输出某些对象的内容。
关键字super
是直接父类对象的引用,在子类中可以随时通过super.xxxx
的方式来访问父类中被子类覆盖的方法或属性。
子类的构造方法中如果有super()
,那么必须位于第一句。如果子类构造方法的第一行代码没有显式地调用super()
或this()
,Java
仍然会默认调用super()
,这里的含义是调用父类的无参数构造方法。因此,构造方法里的super()
是可以省略的。
首先必须明确一点:多态是方法的多态,与属性无关。当父类引用调用子类重写的方法时,多态就出现了。
当某方法的形参是一个父类的引用时,此方法实际使用时的实参可以是该父类任意的子类对象,可以通过不同的子类对象实现不同的行为方式。
多态的主要优势是提高了代码的可扩展性,符合开闭原则。但是多态也有弊端,就是无法调用子类独有的方法。