继承
概念:
- 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
作用:
- 子类拥有父类的属性和方法,减少重复的代码,维护性高。
- 代码简洁,提高了代码的复用性。
主要使用方法:
子类继承父类,可以直接使用父类的属性和方法
一般什么时候用继承: 一般一个小的类和大的类之间这样使用。比如: Animal Dog Cat
特点:
- 子类可以继承父类非private属性和方法
- 子类可以有自己特有的属性和方法
- java类的继承是单继承,但是可以多重继承
- 子类可以重写父类的方法。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
extends和implements的区别
相同的:
- 都属于Java中的继承
- 都发生在多各类中
不同点:
- extends只能单继承,implements可以实现多继承
- extends继承父类时,父类中可以存在方法的默认实现而implements在实现接口时接口中不能有方法实现
- extends发生在子类和父类之间,implements发生在实现
类和接口之间
extends关键字使用方法
一个子类只能拥有一个父类,所以 extends 只能继承一个类
public class Penguin extends Animal{
}
继承的优点:
- 子类中重复的代码只需要在父类中写一遍,所有子类都可以应用
- 只需要修改父类属性和方法,所有的子类都会应用
- 其实这也是继承的缺点,增加了类和类之间的耦合度,耦合度的增加意味着后期扩展性的降低
super关键字
super关键字:
- 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
- super调用构造方法时,只能是第一句
- super不能访问父类的private成员
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
this和super的区别:
- 1 this代表本类对象(this理解为一个代词,就是创建的那个对象,new的那个对象)
- 2 super代表父类对象
- 3 属性和方法都是对象调用的,那么this和super都可以调用属性和方法
构造方法补充:
- 当一个类中没有定义构造方法的时候,系统会默认给该类添加一个无参构造方法
- 当一个类中定义了有参构造方法的时候,系统不会默认给无参构造方法
- 子类的构造方法(无参和有参)里面,第一句默认添加了super(),如果要手动添加的话,必须放在第一句
Java继承关系中各个代码块的运行顺序
- 同一个类里面: 静态>代码块>构造方法
- 子父类里面: 父类静态>子类静态>父类代码块>父类构造方法>子类代码块>子类构造方法
类创建要比对象早,static是属于类的,不属于对象。
在静态的里面不要调用非静态的,也不要用this和super
包
概念:为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间
作用:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3.包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
如何导入包:
- import 导入包 告诉下面的代码,我要用那个包里的那个类
import java.util.Scanner;
- package 告诉我们当前的类属于那个包
package com.xinzhi.abs;
- 完整的类名: 全限定类名
抽象类
什么是抽象:
从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
抽象类:
被abstract修饰的类就叫抽象类
抽象方法:
被abstract修饰的方法就叫抽象方法
概念:
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
特点:
- 抽象类可以有构造方法,但是不能创建对象,抽象类的构造方法是给成员变量初始化的。
- 抽象类中可以有普通的成员变量,也可以有静态成员变量
- 抽象类里面有抽象方法,普通类里面不能有抽象方法
- 普通类继承了抽象类,必须重写抽象类中的抽象方法
- 抽象类也可以有普通的方法
- 抽象类天生就是当父类的。
抽象类与普通类的区别
- 抽象类不能被实例化
- 普通类可以被实例化
- 抽象方法无方法体
- 普通方法有方法体
语法:
public abstract class Pet{//抽象类
public abstract void toHospital();//抽象方法
}
例题:
- 公司中程序员有姓名、工号、薪水、工作内容。
- 项目经理除了有姓名、工号、薪水、还有奖金、工作内容。
- 对给出需求进行数据建模
package com.xinzhi.firm;
public class Employee {
private String name;
private String worknumber;
private int salary;
public Employee() {
}
public Employee(String name, String worknumber, int salary) {
this.name = name;
this.worknumber = worknumber;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWorknumber() {
return worknumber;
}
public void setWorknumber(String worknumber) {
this.worknumber = worknumber;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
package com.xinzhi.firm;
public class Manger extends Employee {
private int bonus;
public void job(){
System.out.println("经理的工作");
}
}
package com.xinzhi.firm;
public class Programmer extends Employee{
public void iob(){
System.out.println("程序员的工作");
}
}
方法重写
概念:
- 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
- 子类能够根据需要实现父类的方法。
- 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
规则:
子父类关系中,子类和父类的方法名、参数列表、返回值必须一致
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
- 访问权限不能严于父类
- 父类的私有方法不能被子类覆盖
- 不能抛出比父类方法更多的异常
- 存在继承或者实现关系
例子:
class ElectricAppliance{
public void move(){
System.out.println("电器需要电压");
}
}
class Television extends Animal{
public void move(){
System.out.println("电视需要220伏");
}
}
public class TestTelevision {
public static void main(String args[]){
// ElectricAppliance对象
ElectricAppliance a = new ElectricAppliance();
// Television 对象
ElectricApplianceb = new Television ();
a.move();// 执行 ElectricAppliance类的方法
b.move();//执行 Television 类的方法
}
}
方法重写与重载之间的区别:
- 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
- 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写。
- 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现