目录
java基础--面向对象
面向对象的三大特性:
**封装:
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
**继承
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。继承可以理解为一个类从另一个类获取方法和属性的过程。如果类B继承于类A,那么B就拥有A的方法和属性。
继承使用 extends 关键字。
在这里先定义一个person类:
class People{ String name; int age; int height; void say(){ System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height); } }
在定义 一个teacher类继承person类:
class Teacher extends People{ String school; // 所在学校 String subject; // 学科 int seniority; // 教龄 // 覆盖 People 类中的 say() 方法 void say(){ System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄"); } void lecturing(){ System.out.println("我已经" + age + "岁了,依然站在讲台上讲课"); } }
- name 和 age 变量虽然没有在 Teacher 中定义,但是已在 People 中定义,可以直接拿来用。
- Teacher 是 People 的子类,People 是Teacher 类的父类。
- 子类可以覆盖父类的方法。
- 子类可以继承父类除private以为的所有的成员。
- 构造方法不能被继承。
继承是在维护和可靠性方面的一个伟大进步。如果在 People 类中进行修改,那么 Teacher 类就会自动修改,而不需要程序员做任何工作,除了对它进行编译。
单继承性:Java 允许一个类仅能继承一个其它类,即一个类只能有一个父类,这个限制被称做单继承性。后面将会学到接口(interface)的概念,接口允许多继承。
对以上进行整理:
public class Demo { public static void main(String[] args) { Teacher t = new Teacher(); t.name = "小布"; t.age = 70; t.school = "清华大学"; t.subject = "Java"; t.seniority = 12; t.say(); t.lecturing(); } } class People{ String name; int age; int height; void say(){ System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height); } } class Teacher extends People{ String school; // 所在学校 String subject; // 学科 int seniority; // 教龄 // 覆盖 People 类中的 say() 方法 void say(){ System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄"); } void lecturing(){ System.out.println("我已经" + age + "岁了,依然站在讲台上讲课"); } }
运行结果:
我叫小布,在清华大学教Java,有12年教龄
我已经70岁了,依然站在讲台上讲课
注意:构造方法不能被继承,掌握这一点很重要。 一个类能得到构造方法,只有两个办法:编写构造方法,或者根本没有构造方法,类有一个默认的构造方法。
**多态
多态分为编译时多态和运行时多态:
- 编译时多态主要指方法的重载
- 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
下面的代码中,乐器类(Instrument)有两个子类: Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
public class Instrument {
public void play() {
System.out.println("Instument is playing...");
}
}public class Wind extends Instrument {
public void play() {
System.out.println("Wind is playing...");
}
}public class Percussion extends Instrument {
public void play() {
System.out.println("Percussion is playing...");
}
}public class Music {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Wind());
instruments.add(new Percussion());
for(Instrument instrument : instruments) {
instrument.play();
}
}
}