面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相互作用传递信息,实现程序开发。
面向对象的三大核心特性:
今天我们重点来讲解Java面向对象的第二个特性:继承性。
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。继承可以理解为一个类从另一个类获取方法和属性的过程。如果类B继承于类A,那么B就拥有A的方法和属性。
继承使用 extends 关键字。
我们先定义一个人类的类,人类的类记录了人类的基本信息。
/**
* 人类
* @author Aires
*
*/
public class Human {
private String name;//姓名
private int age;//年龄
private char sex;//性别
public Human() {}//人类无参构造方法
public Human(String name, int age, char sex) {//人类有参构造方法
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
我们再定义一个程序员类
/**
* 程序人员
* @author Aires
*
*/
public class Programmer {
private String language;//使用语言
public Programmer() {}
public Programmer(String language) {
this.language = language;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
}
通过分析,我们可以知道程序员也是人类的一员,那么我们就让程序员类继承人类
public class Programmer extends Human
同时,我们在程序员的构造方法中就可以为人类的属性进行赋值
public Programmer(String name, int age, char sex,String language) {
super(name, age, sex);
this.language = language;
}
那么我们实例化程序员对象,看看结果
Programmer programmer=new Programmer("James Gosling", 67, '男', "Java");
System.out.println(programmer.getName()+",今年"+programmer.getAge()+","+programmer.getSex()+"性,使用"+programmer.getLanguage()+"开发程序!");
Super关键字,可以用来子类调用父类的成员用,它包括调用父类的public、protected修饰的变量方法。
注意事项:
**方法的重载:**一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。如果只需要执行一个操作,具有相同的方法名称将增加程序的可读性。
**方法的重写:**方法重写基于继承,子类继承父类,子类可以调用父类的方法,同时子类也可以重写父类中的方法,来实现和父类中不同的业务处理逻辑。重写要求子类中方法与父类中的方法名称相同,参数相同,参数类型相同。当子类调用该方法时,基类中的方法则被覆盖。方法重写即:重写父类方法,同名也同参。例如:
人类可以说话
public class Human{
public void speak() {
System.out.println("人类可以说话!");
}
}
程序员可以说话,还可以使用计算机说话
public class Programmer extends Human{
public void speak() {
System.out.println("程序员可以说话!也可以使用计算机说话");
}
}
结果是
Human human=new Human();
human.speak();
Programmer programmer=new Programmer();
programmer.speak();
Java语言中,final关键字有多种用途,其主题都表示“不可变”,但背后的具体内容并不一样。当final关键字用于修饰类时表示该类不允许被继承;当它用于修饰方法时表示该方法在继承该类的子类中不允许被重写。 当final关键字用于修饰变量时表示该变量的值不可变;静态变量、实例成员变量、形式参数和局部变量都可以被final修饰。
final关键字修饰类
当用final关键字修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
public final class FinalDome {
}
public class FinalTest extends FinalDome{
}
Ps:在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
final关键字修饰方法
当用final关键字修饰一个方法时,表明这个方法不能被重写,但是这个方法可以被重载。也就是说我们使用final关键字修饰一个方法时,相当于给这个方法上了一把锁。
public class FinalDome {
public final void say() {
System.out.println("我是终态方法,不能被重写");
}
public final void say(int i) {
System.out.println("我是终态方法,不能被重写,但可以被重载");
}
}
public class FinalTest extends FinalDome{
public final void say() {
System.out.println("我是终态方法,不能被重写");
}
public final void say(int i) {
System.out.println("我是终态方法,不能被重写,但可以被重载");
}
}
Ps:只有在想明确禁止该方法在子类中被重写的情况下才将方法设置为final的。父类中的private方法会隐式地被指定为final方法。
final关键字修饰变量
当用final关键字修饰一个变量时,则表明该变量的值无法被更改。