关于面向对象的概括
面向对象包括很多方面,抽象类,接口,封装,构造器,继承,多态,,等等
抽象类概述:
抽象类用来描述一种类型应该具备的基本特征与功能, 具体如何去完成这些行为由子类通过方法重写来完成。
如:犬科均会吼叫,但属于犬科的狼与狗其吼叫内容不同。所以犬科规定了有吼叫功能,但并不明确吼叫的细节。吼叫的细节应该由狼与狗这样的犬科子类重写吼叫的方法具体实现。
- 即抽象方法指只有功能声明,没有功能主体实现的方法。
- 具有抽象方法的类一定为抽象类。
- 那么犬科就可以定义为抽象类,吼叫方法为抽象方法,没有方法体。
抽象类特点:
(1)抽象类和抽象方法必须用abstract关键字修饰
- abstract class 类名()
- public abstract void 方法名();
(2)抽象类不一定有抽象方法,有抽象方法的一定是抽象类或者接口
(3)抽象类不能实例化
按照多态的方式,由具体的子类实例化,其实这也是多态的一种,抽象类多态
(4)抽象类子类
抽象类和接口的区别:
(1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
(2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
(3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
(4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5、abstract 修饰范围
类和方法。不能修饰常量、变量。被修饰的类不能被继承,被修饰的方法不能重写。
接口
从继承链的中间插入一个类,让它的子类具备某些功能而不影响它们的父类。例如 A -> B -> C -> D -> E,A 是祖先类,如果需要为C、D、E类添加某些通用的功能,最简单的方法是让C类再继承另外一个类。但是问题来了,Java 是一种单继承的语言,不能再让C继承另外一个父类了,只到移动到继承链的最顶端,让A再继承一个父类。这样一来,对C、D、E类的修改,影响到了整个继承链,不具备可插入性的设计。
接口是可插入性的保证。在一个继承链中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何父类。此类将不得不实现这个接口所规定的方法,而子类可以从此类自动继承这些方法,这时候,这些子类具有了可插入性。
我们关心的不是哪一个具体的类,而是这个类是否实现了我们需要的接口。
接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。
接口在面向对象的 Java 程序设计中占有举足轻重的地位。事实上在设计阶段最重要的任务之一就是设计出各部分的接口,然后通过接口的组合,形成程序的基本框架结构。
所以简单总结其用途为:实现类的多继承,以解决Java只能单继承,不支持多继承的问题。
接口实战:(前面的 pubilc abstract 可以省掉)
package myproject03.com.atguishanggu.domain;
public interface Equipment {
public abstract String getDescription();
}
构造器
构造器的作用
1.创建对象
2.初始化对象信息
说明:
1.如果没有显式定义类的构造器,系统默认提供一个空参的构造器
2.定义构造器的格式:权限修饰符 类名 (形参列表){}
3.一个类中定义多个构造器,彼此构成重载
4.一旦我们显示的定义了构造器之后,系统就不再提供默认的构造器
5.一个类中至少有一个构造器
构造器实战:
package oop.demo10;
public class TriAngle {
private int base;
private int height;
public TriAngle(){ //无参构造器
}
public TriAngle(int a,int b){ //有参构造器
base=a;
height=b;
}
public void setBase(int a){
base=a;
}
public int getBase() {
return base;
}
public void setHeight(int b) {
height = b;
}
public int getHeight() {
return height;
}
}
继承
继承是值子类继承父类的所有特性与方法的办法。通常代表词是extend
多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类,基类等。
子类可以直接访问父类中的非私有的属性和行为。
通过extends关键字让类与类之间产生继承关系。
例如: class B extedns A { }
继承相关应用:
package myproject03.com.atguishanggu.domain;
import jdk.net.SocketFlow;
import myproject03.com.atguishanggu.service.Status;
public class Programmer extends Employees {
private int memberId;//开发团队id
private Status status;
private double salary;
}