---------------------- 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培训、期待与您交流! ----------------------