Java复习笔记

去年寒假学习过Java,忘记了很多内容,需要复习一下

static

static 静态关键字

静态成员变量

静态成员变量:属于类,加载一次,内存中只有一份,可被静态和非静态方法访问
使用方法

  • 类名.静态成员变量(推荐)
  • 对象.静态成员变量

静态成员方法

静态成员方法:属于类,建议用类名访问(也可以用对象访问)
访问方法

  • 类名.静态成员方法(推荐)
  • 对象.静态成员方法

注意事项

  • 静态方法只能访问静态成员,不能访问实例成员
  • 实例方法可以访问静态成员,也能访问实例成员
  • 静态方法中不能出现this关键字

static的应用

工具类

如实现生成一个验证码,审核邮箱是否正确,获取系统时间等功能,在工具类中写好,开发时就可以直接调用
特点:
工具类内部都是静态方法,每个方法完成一个功能

建议:
对工具类的构造器进行私有化处理,因为工具类不需要创建对象

静态代码块

package com.study.static_code;

public class Static_Demo1 {

	static {
		System.out.println("静态代码块执行");
	}

	public static void main(String[] args){
	}
}

特点: 随着类的加载而加载,自动触发且只触发一次,执行顺序在main之前
作用: 可以用于初始化静态资源

单例设计模式

保证系统中,应用该模式的类永远只有一个实例,即只能创建一个对象。如:任务管理器对象

饿汉单例模式

在类加载时创建对象

public class SingleInstance {
	/* 定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */
	public static SingleInstance instance = new SingleInstance();   
	
	/* 单例必须私有构造器*/
	private SingleInstance() {System.out.println("创建了一个对象");}
}
懒汉单例模式

在用到对象的时候,才去创建对象

class SingleInstance {

	/*定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次*/
	public static SingleInstance instance; // null

	/* 单例必须私有构造器*/
	private SingleInstance() {}

	/* 必须提供一个方法返回一个单例对象 */
	public static SingleInstance getInstance() {
		//...
		//return ...;
	}
}

继承

继承特点

  • Java不支持多继承,但是支持多层继承

  • 子类可以继承父类的私有成员,但是不能访问

  • 子类可以使用父类的静态成员(共享/继承存在争议)

  • 子父类中的重名成员优先使用子类,如果一定要使用父类的成员可通过super关键字

    super.父类成员变量/父类成员方法
    
  • 重写父类方法:

    • 静态方法、私有方法不能被重写
    • @Override重写注解:可以校验重写是否正确,且可读性好,建议重写方法都添加该注解
    • 子类重写父类方法时,访问权限必须大于等于父类(缺省<protected<public)
      例如:父类的f函数的访问权限为public,子类重写为protected(或不写)就会报错

子类构造器特点

  • 子类不能继承父类的构造器
  • 子类中所有的构造器默认都会先访问父类的无参构造器,再执行自己
    原因:子类初始化之前,需要先完成父类数据空间的初始化
    原理:子类构造器第一行默认是super(),不写也存在
  • 子类调用父类的有参构造器
    //父类有参构造器
    public Animal(String name, int age) {
    	System.out.println("父类构造器被执行" + name + age);
    }
    //子类构造器调用父类有参构造器
    public Dog(String name, int age)  {
    	super(name,age);
    	System.out.println("子类构造器被执行");
    }
    
  • 调用本类兄弟构造器
    作用: 如下面代码中,若构建对象时没有传入schoolName,则会默认schoolName为XiaMenUniversity
    public Student() {
    }
    
    public Student(String name) {
    	// 调用本类兄弟构造器
    	this(name,"XiaMenUniversity");
    }
    
    public Student(String name, String schoolName) {
    	this.name = name;
    	this.schoolName = schoolName;
    }
    
    • this()和super()都只能放在第一行,二者不能共存于一个构造器中
    • 通过this调用本类其他构造器时,被调用的构造器会通过super调用父类构造器,所以还是会调用父类构造器

访问权限

  • 相同包下的类可以直接访问,不同包下的类需要导包
  • 如果一个类中用到不同类,而两个类的类名相同,则默认导入一个类,另一个类需要带包名访问

权限修饰符

范围从小到大:private -> 缺省 -> protected -> public
在这里插入图片描述

final

  • 修饰类:被修饰的类不能被继承
  • 修饰方法:被修饰的方法不能被重写
  • 修饰变量:被修饰的变量被赋值一次后就不能被修改
    • 基本类型: 变量存储的数据值不能修改
    • 引用类型:变量存储的地址值不能修改,但是指向的对象内容可以修改

常量

常量是用public static final修饰的成员变量,必须有初始化值,且执行过程中值不能改变,通常用来记录系统的配置数据
编译阶段会把使用常量的地方替换成字面量

abstract

public abstract class Animal {
	public abstract Run();
}
  • abstract 修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法;不能修饰变量、代码块和构造器
  • 抽象方法只能有签名,不能声明方法体
  • 抽象类不能创建对象
  • 一个类如果定义了抽象方法,则必须定义为抽象类
  • 一个类如果继承了抽象类,则必须重写抽象类的全部抽象方法,否则这个类也必须定义为抽象类