Java-02 方法&继承

方法

参数传递

值类型是值传递,对象是引用传递,传递的是地址

方法签名

方法签名由方法名参数类型组成, 不包括返回值

同一个类中,不能定义两个方法签名一样的方法

方法的重载(Overload)

Java的方法支持方法重载:方法名相同,方法签名不同。
也就是方法名相同,参数类型/个数不同

继承

子类的构造函数必须先调用父类的构造函数,如果没有调用,编译器会帮着自动调用父类的无参数的构造函数(如果父类没有无参数的构造函数,则会报错)

Static

static常用来修饰类的成员:成员变量、方法、嵌套类

  • 成员变量

    • 被static修饰:叫做类变量,静态变量
    • 在程序运行过程中只占用一份固定的内存(存储在方法区)
    • 可以通过实例、类访问(一般是通过类来访问)
  • 方法

    • 被static修饰的话一般叫做类方法/静态方法
    • 类方法里不能使用this
    • 可以直接访问类变量、类方法

成员变量的初始化

编译器会自动为未初始化的成员变量设置初始值

  • 手动给实例变量提供初始值

    • 跟其他语言类似
    • 通过初始化块来初始化
    
    public Person(){
    
    }
    public Person(int age) {
    this.age = age;
    }
    // 初始化块 
    // 通过初始化块来初始化变量
    {
    // 初始化块中的代码会在复制到构造函数的头部先执行(编译器帮我们做的)
    // 也就是构造函数会先执行初始化块中的代码 再执行之后的代码
    age = 10;
    }
    
  • 类变量设置初始值

    • 声明中
    • 静态初始化块中
      • 当一个类初始化时会执行静态初始化块
      • 当一个类第一个被主动使用时,JVM会对类进行初始化
      public static int count;
    // 通过静态初始化块给类变量设置初始值
    static {
    count = 10;
    }
    
  • 可以用多个(静态)初始化块,按照在源码中出现的顺序执行


public class Person {
  public Person(){
    System.out.println("Person - constructor");
  }
  // 初始化块 
  {
    System.out.println("Person - block");
  }


  // 通过静态初始化块给类变量设置初始值
  static {
    System.out.println("Person - static block");
  }
}


public class Student extends Person {
  public Student(){
    System.out.println("Student - Constructor");
  }
  {
    System.out.println("Student - block");
  }
  static {
    System.out.println("Student - static block");
  }
}

Student stud = new Student();

// 打印顺序
Person - static block
Student - static block
Person - block
Person - constructor
Student - block
Student - Constructor

单例

方式一


// 1. 饿汉式 线程安全
public class Singleton {
  // 声明的时候就初始化 
  public static Singleton instance = new Singleton();

  // 构造方法私有化
  private Singleton(){
    // 私有化构造函数 这样外面就不能调用构造方法
  }
  // 构造一个静态方法 返回唯一的静态变量
  public static Singleton getInstance(){
    return instance;
  }
}

方式二

// 懒汉式 线程不安全的 
public class Singleton {
  // 静态变量在程序运行中只有一份内存
  public static Singleton instance = null;

  // 构造方法私有化
  private Singleton(){
    // 私有化构造函数 这样外面就不能调用构造方法
  }
  // 线程不安全的 
  public static Singleton getInstance(){
    if(instance == null) {
      // 当有多个线程同时访问时 可能会多个线程都会走到这里
      // 会创建多个实例
      // 但是在后续使用的时候 instance指向的实例对象还是同一个
      instance = new Singleton();
    }
    return instance;
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容