面向对象
static和final
static关键字可以用来修饰成员变量、方法、代码块(注:static不能修饰局部变量,只能用final)
static叫做静态的、共享的、所属于类的,类被加载的时候会优先加载静态内容
static修饰的内容只有一份,被所有的对象以及类共享,对于static修饰的内容改变,也被所有对象可见
static修饰的内容两种调用方式:
- 通过类名.来访问 (建议)
- 通过创建类的实例对象,然后使用对象. 来访问(浪费内存)
注:在非静态方法中可以直接访问静态方法,反之不行,因为类加载肯定先于对象创建,在对象创建前一定会加载类,但加载类不一定要创建对象。
如何在一个静态内容中调用非静态内容:
- 在非静态内容中加static
- 创建非静态内容的所属对象,通过对象调用
补充:类加载发生在什么时候
- 当前类的静态方法被调用时
- 创建当前类的实例对象
final关键字
final可以修饰变量(局部变量和成员变量)方法和类,修饰成员变量时常和static连用,例static final int num = 3
当用final来修饰变量时,其值不能再发生改变;
final int num = 3;
num = 4;
//以上会出现编译错误
当修饰一个方法时,该方法在子类中将不能被重写;
class Father{
final void write(){
System.out.println("father");
}
}
class Son extends Father{
@Override
void write(){//Cannot override the final method from Father
System.out.println("son");
}
}
当修饰一个类时,该类不能被继承。
final class Father{
}
class Son extends Father{
}
//The type Son cannot subclass the final class Father
构造器
在类中用来创建对象那个的方法称之为构造器 又称构造函数、构造方法
- 构造器是一个特殊的方法:
- 方法名和类名相同
- 方法无返回值
- 在方法声明中不用声明方法类型
- 构造器允许方法重载
- 系统会默认构建一个无参构造器(空构造器),如果在当前类中声明了有参构造器之后,无参构造器就不存在了。所以声明有参构造器时,要同时声明一个无参构造器。不然在类中去调用有参构造器时报错
public class Animal {
public int age;
public int gender;
public Animal() {
System.out.println("无参构造器");
}
public Animal(int age) {
System.out.println("这是一个有参构造器"+age);
}
public static void main(String[] args) {
Animal animal = new Animal(3);
}
}
运行结果:
这是一个有参构造器3
- 构造器的作用就是用来创建对象的,构造器的调用只能通过new关键词去调用
this和super
this的用法:
this可以代指当前对象,通过this.来访问对象的属性或方法,当需要区分同名变量(局部变量和成员变量)时不能省略,其他时候可以省略
this可以用于构造器之间的互相调用 ,通过this()来调用, this()一定要在构造器的首行
super的用法(和this基本相同):
super可以代指当前对象的父类对象,通过super.来访问属性或方法,当需要区分同名变量(局部变量和成员变量)时不能省略,其他时候可以省略
super还可以调用父类的构造器 ,通过super() 来调用, super() 一定要在构造器的首行 ,默认情况下调用的父类的无参构造器(默认情况下每个类中都存再一个无参构造器 哪怕不写也存在)
当父类中存在其他构造器时,无参构造器不存在,此时如果再子类中没有通过super()显式的指定调用的构造器会导致程序报错。
this和super的关系:
显然,在构造器中this()和super()不能同时出现,如果两个都不存在,默认是存在的super()。
因为子类继承了父类,必须要使用super()来调用父类的构造器将父类加载进内存,所以基本每个构造方法都会隐式地去调用super,如果同时使用this和super,this会调用其他构造函数,结果导致多个构造器都调用super,显然是没有意义的,不能通过编译。
重写和重载
重载:同一个类下,存在多个方法名相同参数列表不同(参数顺序、参数类型、参数长度不同)的方法。
重写(也称覆盖):子类对父类方法的重写,可以在子类的方法上加入@Overried 注解来判断是否是重写。
重写需满足的条件:
方法名相同,参数类型相同,要发生继承关系
补充:子类返回类型小于等于父类方法返回类型,子类抛出异常小于等于父类方法抛出异常,
重写的目的在于对父类一些方法进行拓展,来满足自身的需求。
权限修饰符
修饰符的作用是用来屏蔽一些底层的实现逻辑,降低调用者(程序员)的复杂度,体现了java的封装特性。
- 确保当前类更加安全。
- 修饰符可以修饰类
- 属性(成员变量) :
- 避免随意.属性,修改获取属性 造成数据不安全
- 如果用private修饰的话 一定要保证对外提供get、set方法让外部可见
- 方法
屏蔽底层调用细节,降低调用者(程序员)的复杂度 使得代码更加健壮
权限修饰符 | 本类 | 同包下的子类 | 同包下的无关类 | 异包下的子类 | 异包下的无关类 |
---|---|---|---|---|---|
public | √ | √ | √ | √ | √ |
private | √ | × | × | × | × |
默认 | √ | √ | √ | × | × |
protected | √ | √ | √ | √ | × |
最常用的两种权限修饰符是public和private。
public:都能访问,被public修饰的方法、类、变量能被所有类可见
private: 只在本类可见
private可以屏蔽外界对它的访问,所以要想使用被private修饰的属性,需要对外提供set和get方法
protected 同包下和异包下的子类可见
默认: 不写任何权限修饰符,同包下可见,异包下不可见