Java - 修饰符(类的加载顺序+抽象类+接口) June 26,2019

类的加载:

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.接口类中能否定义属性?可以,但必须初始化

posted @ 2019-06-26 20:32  亿贫如洗杨道长  阅读(42)  评论(0编辑  收藏  举报