本文深入探讨面向对象编程的核心概念,包括继承、方法重写、this
和super
关键字的使用,以及抽象类和方法的定义与实现。通过本文的学习,你将能够:
this
关键字调用当前对象的成员。super
关键字调用父类的成员。继承是一种代码复用机制,通过将共通代码抽取到父类中,子类可以直接继承父类的功能。在Java中,使用extends
关键字实现继承。
注意点:
学习继承:
定义一个父类,将重复代码放入其中。然后,定义子类继承父类,通过extends
关键字。创建子类对象后,可以直接使用父类中的非私有成员。
public class Employee {
String name;
int age;
public void work(){
System.out.println("工作");
}
private void eat(){
System.out.println("员工要干饭");
}
}
public class Teacher extends Employee{
}
public class Manager extends Employee{
}
public class Fu {
int numFu = 100;
}
public class Zi extends Fu{
int numZi = 10;
}
public class Test01 {
public static void main(String[] args) {
Fu fu = new Fu();
System.out.println(fu.numFu);//父类中的numFu
Zi zi = new Zi();
System.out.println(zi.numZi);
System.out.println(zi.numFu);//继承了父类,可以使用父类中非私有成员
}
}
public class Fu {
int numFu = 100;
int num = 10000;
}
public class Zi extends Fu{
int numZi = 10;
int num = 1000;
}
new
的对象是谁,优先调用谁的方法。如果子类没有该方法,则会寻找父类中的方法。public class Fu {
public void methodFu(){
System.out.println("我是父类中的methodFu");
}
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu{
public void methodZi(){
System.out.println("我是子类中的methodZi方法");
}
public void method(){
System.out.println("我是子类中的method方法");
}
}
方法重写是指子类中有一个与父类方法名和参数列表相同的方法。使用@Override
注解可以检测是否为重写方法。
注意事项:
public class Fu {
public void methodFu(){
System.out.println("我是父类中的methodFu方法");
}
public void method(){
System.out.println("我是父类中的method方法");
}
void method01(){
}
/* public static void method02(){
}*/
public Fu method03(){
return null;
}
}
public class Zi extends Fu{
public void methodZi(){
System.out.println("我是子类中的methodZi方法");
}
@Override
public void method(){
System.out.println("我是子类中的method方法");
}
@Override
public void method01(){
}
/* public static void method02(){
}*/
@Override
public Zi method03(){
return null;
}
}
使用场景: 功能升级改造,子类需要对父类中已经实现好的功能进行重新改造
public class Fu {
public void methodFu(){
System.out.println("我是父类中的methodFu方法");
}
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu{
public void methodZi(){
System.out.println("我是子类中的methodZi方法");
}
@Override
public void method(){
System.out.println("我是子类中的method方法");
}
}
super
和this
public class Fu {
public Fu(){
System.out.println("我是父类中的无参构造");
}
}
public class Zi extends Fu{
public Zi(){
super();
System.out.println("我是子类中的无参构造");
}
public Zi(int i){
super();
System.out.println("我是子类中的有参构造");
}
}
super
和this
的具体使用super
super()
调用父类无参构造,或使用super(实参)
调用父类有参构造。super.成员变量名
和super.成员方法名(实参)
。public class Fu {
int num = 10;
public Fu(){
System.out.println("我是父类中的无参构造");
}
public Fu(int data){
System.out.println("我是父类中的有参构造");
}
public void method(){
System.out.println("我是父类中的method方法");
}
}
public class Zi extends Fu{
int num = 100;
public Zi(){
super();
System.out.println("我是子类中的无参构造");
}
public Zi(int num){
super(10);
System.out.println("我是子类中的有参构造");
}
public void method(){
super.method();
System.out.println("我是子类中的method方法");
System.out.println(num);
System.out.println(super.num);
}
}
this
this()
调用当前对象的无参构造,或使用this(实参)
调用当前对象的有参构造。this.成员变量名
和this.成员方法名(实参)
。public class Person {
int num = 10;
public Person(){
this();
System.out.println("我是Person中的无参构造");
}
public Person(int data){
this();
System.out.println("我是Person中的有参构造");
}
public void method(){
int num = 20;
System.out.println(num);
System.out.println(this.num);
this.method01();
System.out.println("我是Person类中的method方法");
}
public void method01(){
System.out.println("我是Person类中的method01方法");
}
}
抽象类和抽象方法是面向对象编程中用来表达共性和多样性的工具。抽象方法没有具体实现,必须在子类中重写。
关键字:
abstract
用于定义抽象方法和抽象类。注意事项:
public abstract class Animal {
public abstract void eat();
public abstract void drink();
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
@Override
public void drink() {
System.out.println("狗喝水");
}
}
public abstract class Employee {
private String name;
private int age;
public Employee() {
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
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 abstract void work();
}
本章节通过一个IT公司的员工体系案例,展示了如何定义类、指定继承关系,并实现工作方法的调用。
案例描述: 某IT公司根据员工的工作内容,划分了不同的部门和职位。每个员工都有员工编号和姓名,并执行他们负责的工作。
类的定义和继承关系:
Employee
:基类,包含员工编号和姓名。Developer
:抽象类,继承自Employee
,代表研发部员工。JavaEE
、Android
:具体类,继承自Developer
,代表不同的研发工程师。Maintainer
:抽象类,继承自Employee
,代表维护部员工。Network
、Hardware
:具体类,继承自Maintainer
,代表不同的维护工程师。对象创建和方法调用:
通过创建具体工程师类的对象,调用work
方法,展示每个员工的工作内容。
public abstract class Employee {
private int id;
private String name;
public Employee() {
}
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void work();
}
public abstract class Developer extends Employee{
}
public class JavaEE extends Developer{
@Override
public void work() {
System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"正在开发网站");
}
}
public class Android extends Developer{
@Override
public void work() {
System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"正在开发app");
}
}
public class Test01 {
public static void main(String[] args) {
JavaEE javaEE = new JavaEE();
javaEE.setId(1);
javaEE.setName("涛哥");
javaEE.work();
System.out.println("===============");
Android android = new Android();
android.setId(2);
android.setName("金莲");
android.work();
}
}