本文共 3508 字,大约阅读时间需要 11 分钟。
概念:成员变量/属性,使用static修饰后,该属性由对象层级提升为类层级。且随着类的加载而初始化,和是否创建对象无关。也就是说,这个属性是被类拥有,该类的所有对象都是可以实现共享
被static修饰的,成员变量,不在堆内存,也不再栈内存。而是在方法区,被多个对象共享
被static修饰的成员变量,用 “类名.” 方式访问
使用方式:
普通方法:能够调用 普通方法和属性,也能调用 被static修饰的方法和属性
被static修饰的方法:只能访问,被static修饰的方法和属性。因为,被static修饰,会随着类的加载而加载,类加载的时候,是没有创建对象的。所以不能使用普通的成员方法
static修饰代码块:
普通代码块,随着构造方法的执行而执行,但是要优先构造方法加载执行 (就是说每次创建对象,都为执普通代码块行代码块)
普通代码块的使用场景:
static修饰的代码块:
static{ ...}
和普通代码块不同的是,static修饰的代码块:
总结:
static定义的属性,保存在方法区,被所有堆内存中的对象共享 (仅限于该类的对象)
static修饰的成员,随着类加载而加载到方法区,直到类销毁时才销毁。生命周期很长。
main方法,是类加载后,才被执行。所以,static修饰的成员要优先于main方法和构造方法的执行
在开发中,只有被共享的才加 static,不要乱用
(重点)为什么被static修饰的方法中,不能使用this?
this,本质上是当前类对象的引用。在构造函数执行之后,才能存在。而static修饰的方法在类加载时就已经加载进内存。所以,不能使用this
关键字:extends
本质:从已有类得到继承信息创建新类的过程
先执行父类的静态代码块,再执行子类的静态代码块。
执行父类的构造块,执行父类的构造方法体。
执行子类的构造块,执行子类的构造方法体。
从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写
一个和父类一样的方法来覆盖从父类中继承下来的版本,该方式就叫做 方法的重写(Override)前提:继承
本质:父类引用指向子类的对象,所以你用父类引用去调用方法或属性,其实访问的是子类对象的内存空间。
使用多态时:
当父类,想要调用子类独有的方法时,就需要将子父类的引用转化为子类的的引用。
分类:
自动类型转换
子类转化为父类,例如: 狗是动物
强制类型装换
父类转化为子类,例如:动物是狗 (不一定啊,所以有些时候强制转换会出问题)
注意事项:
引用类型之间的转换,必须发生在父子类之间 (前提:继承)
强制转换,可能会产生异常 : ClassCastException,解决办法:instanceof方法。语法格式
引用名.instanceof (数据类型 )
在强制类型转换之前,需要判断:
Animal animal = new Cat();if(animal.instanceof(Dog)){ // 如果类型对应才能强转 Dog dog = (Dog)animal;}
用instanceof方法判断后,就会避免 ClassCastException 的风险
其实,这也是多态的缺点:父类想要调用子类独有的方法,要进行强制类型转换
表示抽象,abstract的作用,和字面意思相同,表示抽象,就是说不能实现的事物。用法:
抽象方法:
不能具体实现的方法,所以没有方法体,以分号 " ; " 结尾
抽象类:
不能具体实例化的类 (不能创建具体的对象)
注意事项:
之所以 有抽象类,是为了避免我们调用抽象方法,所以才有了抽象类。那么,抽象类中如果没有抽象方法,确实可以,但这样是没有什么意义
接口是一种比抽象类还要抽象的类,体现在接口中的方法全部是抽象方法
但是从,JDK 1.9开始,接口中允许出现私有方法 (Java9的新特性)
在接口中定义一个默认方法,子类可以不重写(Java8的新特性)
如果给一个接口新添加一个方法,那么所有实现类都要重写,所谓牵一发而动全身,有些实现类压根儿就不需要新增接口中的方法。所以才有了这一新特性
// 格式(public 可以省略):public default void show{ ...;}
而且,默认的方法实现类也可以重写。
因为,接口不能创建对象。所以,在接口中定义一个 static静态方法,可以通过 接口名**.**方法名的形式调用(Java8的新特性)
// 通过 接口名 直接调用public static void test{ ...}
使用 Interface 关键字定义
// 定义一个 InterfaceTest 接口public interface InterfaceTest{ // 接口中的属性,一定是常量 // public static final可以省略 public static final int NUM = 1; // 接口中定义的方法一定是抽象方法 // public abstract 可以省略 public abstract void show(); // 但是从 Java9的新特性,允许出现私有方法 private void privateShow(){ // 方法体 ... }}
接口主要是对类的行为的一种约束
关键字不同,接口 - Interface,抽象类 - abstract
抽象类是继承 - extends,接口是 实现 - implements
继承抽象类,只能是单继承; 而,实现接口,可以做到多个接口同时实现
抽象类中,可以有构造方法;接口中,不能有构造方法
转载地址:http://khuen.baihongyu.com/