黑马程序员——java基础之继承

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

继承:用来表达概念上具体化延续的具体概念。

1. 子类继承父类的属性和方法

2. 构造器不能继承

3. 实例化子类,会递归分配所有父类的空间

4. 子类构造器一定调用父类构造器

5. 类一定有构造器(父类、子类)

继承中的构造器

●  子类构造器一定调用父类构造器

/**
 * 继承中的构造器调用
 * 子类一定调用父类构造器
 * 1 子类默认调用父类默认构造器
 */
public class ConstructorDemo {

}
class A{
  public A(){
  }
}
class B extends A{
  public B(){
    super();//子类默认调用父类默认构造器
  }
}
注:

1. 子类构造器默认调用父类无参数构造器

2. super()表示调用父类构造器

3. 使用super()调用父类构造器,必须写在子类构造器第一行

4. this()必须写在子类构造器第一行

5. 有super()就不能有this(),两者互斥

class A{
  int a;
  public A(int a){this.a = a;}//父类提供了有参构造器
}
class B extends A{//编译错误,子类找不到父类无参构造器
}

解决办法:显示调用父类有参构造器

class A{
  int a;
  public A(int a){this.a = a;}//父类提供了有参构造器
}
class B extends A{
  public B(){
    super(1);
  }
}
注:如果父类没有无参数构造器,就必须在子类中明确指定调用父类的有参数构造器。

对象的实例化过程

第1步:在创建类之前,检查类是否加载(是将硬盘上的.class文件加载到内存中),如果没有加载就加载这个类,在这个类加载之前要加载所有的父类。

              java 运行时采用的策略:懒惰式加载(按需加载):如果第一次用到就加载,只加载一次。通过CLASSPATH指定的路径寻找类文件(.class),加载以后是一个对象,类型是Class。

第2步:在内存堆中分配对象空间,递归分配所有父类和子类属性空间。属性默认自动初始化,自动初始化为“0”值。

第3步:进行属性的赋值。

第4步:递归调用父类构造器。(默认调用父类无参数构造器!)

第5步:调用本类构造器。

继承中的语法现象

父类型变量可以引用子类型实例,父类型的实现是多态的。

引用变量类型的自动转换(“小类型”到“大类型”的自动转换)。

子类可以覆盖父类的方法,修改父类的行为。

方法覆盖:子类覆盖了父类“相同方法签名”的方法。

方法的覆盖是由方法的动态绑定实现的,是java虚拟机运行时候确定执行哪个对象哪个方法,java最终执行子类的方法。

public class Demo2 {
  public static void main(String[] args) {
    B b = new B();
    A a = b;//父类型引用可以指向子类型引用的对象
    a.print();//输出结果"B",java最终执行子类的方法
  }
}
class A{
  public void print(){
    System.out.println("A");
  }
}
class B extends A{
  //子类覆盖父类方法,修改父类方法的行为
  public void print(){
    System.out.println("B");
  }
}
引用类型转换

1. 向下转型(隐式/自动类型转换),是小类型到大类型的转换

2. 向上转型(强制类型转换),是大类型到小类型

3. instanceof 运算符,用来检查引用对象的类型,经常与“引用类型强制转换”配合,实现安全的类型转换,避免类型转换异常。

public class Demo2 {
  public static void main(String[] args) {
    Circle c = new Circle();
    Shape s = (Shape)c;//表示圆是图形
  }
}
class Shape{}
class Circle extends Shape{}

抽象类

抽象方法,只有行为的概念,没有具体的行为实现。

1. 使用:abstract 关键字修饰,并且没有方法体

2. 包含抽象方法的类,就一定是抽象类

3. 抽象类不能直接创建实例,可以定义引用变量

4. 抽象类只能被继承,一个具体类继承一个抽象类,必须实现所有的抽象方法

/** 包含抽象方法的类一定是抽象类
 * 普通类:是具体类,是具体概念,如:圆,单选题
 * 抽象类:不具体,表达抽象概念,如:图形,考题
 */
public abstract class Shape {
  /**
   * 抽象方法,图形可以计算面积,
   * 具体计算过程不清楚(抽象的)
   */
  public abstract double area();
  
  public abstract boolean contains(int x, int y);
}
接口:全部的方法都是抽象方法,全部的属性都是常量。

1. 接口是特殊的抽象类

2. 接口用来表示纯抽象概念,没有任何具体的方法和属性

3. 接口不能实例化,可以定义变量

4. 接口变量可以引用具体实现类的实例

5. 接口只能被实现(继承),一个具体类实现接口,必须使用全部的抽象方法

6. 接口之间可以继承(implements)

7. 一个具体类可以实现多个接口,表示:一个概念即是XXX也是XXX

8. 接口中的属性,默认是常量 public static final

9. 接口中的方法一定是 public abstract 的(默认,可以不写)

10. 实现一个接口,使用关键字implements,实现实际上是一种继承关系


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值