封装(Encapsulation )
隐藏内部细节
1 | //save as Student.java |
1 | Compile By: javac -d . Test.java |
继承(Inheritance )
1 | class Calculation { |
My_Calculation
使用了继承自Calculation
的方法addition
和Subtraction
以及变量z
,只有multiplication
是My_Calculation
自身定义的方法
避免了重复
多态(Polymorphism )
静态编译时多态
例1
方法重载(overload)
在编译时确定
1 | class Adder { |
例2
方法的参数在编译阶段常被静态地绑定
在whichFoo方法中,形式参数arg2的类型是Base, 因此不管arg2实际引用的是什么类型,arg1.foo(arg2)匹配的foo都将是foo(Base)
1 | public class Main { |
动态运行时多态
例1
方法重写(override)
在运行时确定
1 | public Class BowlerClass{ |
例2
1 | public class Main { |
1 | output: |
当执行 Father father = new Son();
发生了向上转型,在编译期间 father就是个Father对象,系统不知道实际上它是一个 Son对象,这得在运行期间由JVM判断
在我们调用father.age
的时候实际上,在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定,即调用的是Father类的age成员变量
在调用father.name()
的时候,注意这是个static方法,java当中的方法final,static,private和构造方法是前期绑定,因此调用的是Father类中的name方法
在调用father.age()
的时候,需要采用动态绑定,此时father会被解析成它实际的对象,即Son对象,因此实际调用的是Son.age()
参考
https://stackify.com/oops-concepts-in-java/