类的加载:
public class Animal { public String test = "父类的属性"; public static String testStatic = "父类的静态属性"; public Animal(){ System.out.println("父类的无参数构造方法"); } static { Animal.testStatic(); System.out.println("父类的静态代码块"); } { this.test(); System.out.println("父类的代码块"); } public static void testStatic(){ System.out.println("我是父类的静态方法"); } public void test(){ System.out.println("我是父类中的普通方法"); } } public class Person extends Animal { public String test = "子类的属性"; public static String testStatic = "子类的静态属性"; public Person(){ System.out.println("子类的无参数构造方法"); } static { Person.testStatic(); System.out.println("子类的静态代码块"); } { this.test(); System.out.println("子类的代码块"); } public static void testStatic(){ System.out.println("我是子类中的静态方法"); } public void test(){ System.out.println("我是子类中的普通方法"); } } public class Test { public static void main(String[] args){ Person person = new Person(); person.hashCode(); } } 执行结果: 我是父类的静态方法 父类的静态代码块 我是子类中的静态方法 子类的静态代码块 我是子类中的普通方法 父类的代码块 父类的无参数构造方法 我是子类中的普通方法 子类的代码块 子类的无参数构造方法
存在继承关系的类 加载机制 及执行过程
加载类的过程---静态元素已经加载
new Person();
1.加载父类
2.父类会产生自己的静态空间 属性 方法 块
执行静态块
3.加载子类
4.子类会产生自己的静态空间 属性 方法 块
执行静态块
5.开辟对象空间
6.加载父类的非静态成员 属性 方法 块 构造方法
7. 执行块 执行父类构造方法
8.加载子类的非静态成员 属性 方法 块 构造方法
9. 执行块 执行子类构造方法
10.将对象空间的地址引用交给 变量来存储
抽象类(abstract)
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
1.可以修饰什么
修饰方法
用abstract修饰符修饰的方法,叫抽象方法,只有方法结构,没有方法执行体
注意native修饰的方法虽然也没有方法体,但是不是抽象方法,只是执行过程是其他语言写的(看不见)
修饰类
用abstract修饰符修饰的类叫做抽象类
2.修饰后有什么特点
抽象类中不是必须含有抽象方法
抽象方法必须放在抽象类中(或者接口中),普通类中不允许含有抽象方法。
3.抽象类里面有什么
属性:可以含有一般的属性,也可以含有private、static、final等
方法:可以含有一般的方法,也可以含有private、static、final等
块:可以含有一般的程序块,也可以含有static程序块
构造方法:可以含有构造方法,包括重载
4.抽象类如何使用
抽象类含有构造方法,但是我们不能通过调用构造方法直接创建对象。
抽象类只能通过子类单继承来做事
5.类和类的关系
抽象类 ------ 直接单继承 ------ 抽象类 可以
抽象类 ------ 直接单继承------具体类 可以
具体类------ 直接单继承------抽象类 不可以(将父类的抽象方法具体化 或子类也变成抽象类)
抽象类中可以没有抽象方法,全部都是具体成员
抽象类中可以没有具体成员,全部都是抽象方法
接口可以理解为抽象到极致------>还是一个类的结构 不能用class修饰 改用interface修饰
接口也是一个类的结构 只不过 用interface修饰,替换原有的class
1.有什么 成员
属性 不能含有一般属性 只能含有公有的静态的常量 public static final
方法 不能含有一般方法 只能含有公有的抽象的方法(1.8 defualt修饰具体方法)
块 不能含有一般程序块 也不能含有static块(块本身就是具体的 接口中不让有具体的)
构造方法 不能含有构造方法
2.如何使用 创建对象
不能创建对象
只能通过子类多实现(implements)来做事
public class A implements B,C,D{
3.与别的类结构关系
接口不能继承别的类 最抽象
抽象类----直接多实现----接口 可以
具体类----直接多实现----接口 不可以(必须将接口中的抽象方法具体化 自己变成抽象类)
*接口---多继承---接口 可以直接多实现
1.接口不能继承接口?可以
2.接口能不能实现接口?不可以
3.抽象类能不能实现接口?可以,但是抽象类也可以不实例化方法
4.接口类中能否定义属性?可以,但必须初始化