传智播客黑马Java学习笔记_09

在子类创建对象时,发现父类的构造方法也运行了,为什么呢?

在子类的构造函数中第一行有一个隐式语句super();

class Fu{
    Fu(){
    System.out.println("Fu is running");
    }
}

class Zi extends Fu(){
    Zi(){
    //super(); 隐式语句 空参数构造函数
    System.out.println("Zi is running ")
    }
}

如果父类没有空的构造函数,子类必须用super()明确调用哪个构造函数。

 

一个对象实例化的过程

Person person=new Person();

  1. JVM会读取指定路径下的Person.class文件,并加载进内存,并会先加载父类
  2. 在堆内存中开辟空间,分配地址
  3. 并在对象空间中给成员属性默认初始化
  4. 调用对应的构造函数进行初始化
  5. 在构造函数中第一行调用的是父类的构造函数
  6. 父类构造函数的调用完后,对子类的属性进行显式初始化
  7. 在进行子类构造函数的特定初始化
  8. 初始化完毕后,将地址值赋给引用变量

final关键字(继承弊端,打破了封装性)

  1. final是一个关键字,可以修饰类,方法,变量
  2. final修饰的类不可以被继承
  3. final修饰的方法不可以被覆盖
  4. final修饰的变量是一个常量,只能赋值一次

为什么要用final?

其实如果一个数据是固定的,直接使用这个数据就行了,但是这样阅读性差 ,所以给该数据起个名字,且不能变化,加上final

 

抽象类abstract

  1. 方法只有声明而没有实现时,该方法是抽象方法需要用abstract修饰,抽象方法必须定义在抽象类中,该类也必须用abstract修饰
  2. 抽象类不可以被实例化,因为调用抽象方法没有意义
  3. 抽象类必须有子类覆盖其所有抽象方法后,其子类才可以实例化,否则该子类还是抽象类。

抽象类有关问题

  • 抽象类中有构造方法吗?

有,给子类进行初始化

  • 抽象类可以不定义抽象方法吗?

可以,但是很少见,目的就是不让该类创造对象,AWT适配器就是这种类。通常这个方法中有方法体但是没有内容

abstract class Demo{
    public void show(){}
    public void show2(){}
}
  • 抽象类关键字不可以与哪些关键字使用
  1. private 因为抽象方法需要被覆盖
  2. static 抽象方法的调用没有意义
  3. final 抽象类需要被继承,抽象方法需要被覆盖
  • 抽象类和一般类的异同点

         一般类有足够的信息描述

          抽象类的信息可能不足

         一般类中不能定义抽象方法

         抽象类中可以定义抽象方法和非抽象方法

         一般类可以被实例化

          抽象类不可以被实例化

抽象类继承练习

abstract class Employee{
    private int id;
    private String name;
    private doublie pay;
    Employee(int id,String name,doublie pay){
        this.id=id;
        this.name=name;
        this.pay=pay;
    }
    public abstract void work();
}


class Programmer extends Employee{
    Programmer(int id,String name,doublie pay){
        super(id,name,pay);
     }
     public void work(){
        System.out.println("code...");
     }
}


class Manager extends  Employee{
    private double bouns;
    Manager (int id,String name,doublie pay,double bouns){
        super(id,name,pay);
        this.bouns= bouns;
    }
         public void work(){
        System.out.println("check...");
     }
}

 

接口

当一个抽象类中的所有方法都为抽象方法时,这是可以通过接口来表示。

接口中常见的成员都有固定的修饰符

全局常量 public static final

抽象方法 public abstract

接口中的成员都是公共权限

interface Demo{
    public static final int num=4;
    public abstract void show();
}

类与类之间是继承关系,类与接口之间是实现关系,接口与接口是继承关系,接口可以多继承

接口不可以实例化

只有实现了接口的子类覆盖了所有抽象方法后该子类才可以实例化,否则该子类是一个抽象类

​

interface Demo{
    public static final int num=4;
    public abstract void show();
}


class Demo1 implements Demo{
    public abstract void show(){}
}
​

在java中不支持多继承,因为会出现不确定性,因为父类的方法都含有方法体,java进行了改良成多实现,不会出现调用的不确定性,因为接口都为抽象方法没有方法体需要实现

​

interface Demo1{
    public static final int num=4;
    public abstract void show();
}

interface Demo2{
    public abstract void show();
}

class Demo3 implements Demo1,Demo2{
    public abstract void show(){}
}
​

 

抽象类与接口的区别

 

1、抽象类需要被继承,只能单继承

      接口需要被实现,可以多实现

2、抽象类可以定义非抽象方法,子类继承后可以使用非抽象方法

      接口只能定义抽象方法

3、抽象类的继承是 is a关系,是体系中的共性内容

      接口是 like关系,是体系中的额外内容(扩充)

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值