面向对象 - 继承、封装、多态、转型
继承(Extends)
-
- 面向对象继承:子类继承父类,子类是父类的扩展,例如你的财产、经验、知识可以继承给你的孩子;但不是所有类都可以继承,例如很私密的东西,就不能继承给你的孩子。继承实现了代码重用,不用再敲重复的代码了。
public class Test { public static void main(String[] args) { // 由于Student继承了Person,只需创建Student对象就可以直接使用Person中的变量、方法 Student stu = new Student(); stu.name = "黄泽风"; stu.age = 21; stu.rest(); Student stu2 = new Student("黄泽雨",18,"山东南翔开挖掘机"); System.out.println(stu.name + "\t" + stu.age); System.out.println(stu2.name + "\t" + stu2.age + "\t" + stu2.major); } } class Person{ String name; int age; public void rest() { System.out.println("休息一会!"); } } // 继承Person类 class Student extends Person { String major; public void study() { System.out.println("学习2小时!"); } // 构造器,可直接调用父类的变量 public Student(String name, int age, String major) { this.name = name; this.age = age; this.major = major; } // 手动修改构造器后,IDE软件将不会自动添加空构造器 public Student() {} }
- 父类也称作超类、基类、派生类等。
- Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
- Java中类没有多继承,接口有多继承。
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
在Eclipse中选中类按Ctrl+T可查看类的继承关系
- 面向对象继承:子类继承父类,子类是父类的扩展,例如你的财产、经验、知识可以继承给你的孩子;但不是所有类都可以继承,例如很私密的东西,就不能继承给你的孩子。继承实现了代码重用,不用再敲重复的代码了。
封装(Encapsulation)
-
- 封装的作用:做一个产品要追求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。封装可以提高代码安全性、复用性、可维护型、使用者便捷性。利用修饰符public(公共)、default(缺省)、protected(保护)、private(私有)来控制访问权限。
package me.hzyis.test; public class Test { public static void main(String[] args) { Info i = new Info(); i.setAge(-10); i.setName("黄泽雨"); i.setFalg(true); System.out.println(i); } } class Info{ private int age; private String name; private boolean falg; // 使用get或set方法代替直接修改私有变量 // age的get和set方法 public int getAge() { return age; } public void setAge(int age) { // 判断age是否合法 if(age<0 || age>130) { this.age = 0; //不合法默认0 }else { this.age = age; //合法才能赋值给属性age } } // name的get和set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } // flag的is和set方法,boolean值的不是get是is public boolean isFalg() { return falg; } public void setFalg(boolean falg) { this.falg = falg; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
- 封装的作用:做一个产品要追求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。封装可以提高代码安全性、复用性、可维护型、使用者便捷性。利用修饰符public(公共)、default(缺省)、protected(保护)、private(私有)来控制访问权限。
多态(Polymorphism)
-
- java包:多态指的是同一个方法调用,由于对象不同可能会有不同的行为;多态与属性无关,指的是方法的多态;多态存在有3个必要条件:继承,方法重写,父类引用指向子类对象;父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
package me.hzyis.test; public class Test { public static void main(String[] args) { Animal a = new Animal(); animalCry(a); Dog d = new Dog(); //多态,可避免过多重载方法 animalCry(d); //子类对象给父类引用,也就是父类引用 指向 子类对象 animalCry(new Cat()); } static void animalCry(Animal a) { //传入Animal类的实例a a.shout(); //Animal类的实例a的方法shout } } class Animal { public void shout() { System.out.println("叫了一声!"); } } class Dog extends Animal { //继承 // 重写 public void shout() { System.out.println("旺旺旺!"); } } class Cat extends Animal { public void shout() { System.out.println("喵喵喵!"); } }
- java包:多态指的是同一个方法调用,由于对象不同可能会有不同的行为;多态与属性无关,指的是方法的多态;多态存在有3个必要条件:继承,方法重写,父类引用指向子类对象;父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
对象转型(Casting)
-
- 对象转型:父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换;向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法,这时我们就需要进行类型的强制转换,我们称之为向下转型!
package me.hzyis.test; public class Test { public static void main(String[] args) { Animal a = new Animal(); animalCry(a); Dog d = new Dog(); //自动向上转型 animalCry(d); animalCry(new Cat()); Dog d2 = (Dog)d; //强制向下转型 d2.seeDoor(); } static void animalCry(Animal a) { a.shout(); } } class Animal { public void shout() { System.out.println("叫了一声!"); } } class Dog extends Animal { public void shout() { System.out.println("旺旺旺!"); } public void seeDoor() { System.out.println("看门!!!"); } } class Cat extends Animal { public void shout() { System.out.println("喵喵喵!"); } }
- 对象转型:父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换;向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法,这时我们就需要进行类型的强制转换,我们称之为向下转型!