1、静态类(static)
什么是静态:
static静态的,不变的,在某个类中只有一个,不会因实例化对象的不同而不同。
static可以修饰类、字段、属性、方法 等。
如一个方法前加上static修饰后要对其进行调用可以直接通过类名点出来,不用再对类进行实例化
静态类:
1、只能包含静态成员(静态方法或静态变量),非静态成员是不能使用的,而非静态类可以包含静态的方法、字段、属性或事件,且无论对这个非静态类创建多少个实例,它的静态成员都只有一个。
2、不能对其实例化。
3、不能被继承,因为静态类本质是一个抽象的密封类。
4、不能包含实例构造函数。
静态变量:
1、static只能修饰成员变量,不能修饰局部变量。
2、表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值。
3、静态变量一直记录变量的值,一直到下次赋值时。
4、不同线程下访问的静态属性总是同一属性,如果某一线程更改了属性值,将造成其他线程访问属性值的错误。因此方法中访问同一静态属性就需要使用lock关键字,或创建互斥对象来保持静态属性在同一时间只能被某一对象的属性或方法 访问。
5、静态成员只被创建一次,所以静态成员只有一份,而实例成员有多少个对象,就有多少个成员。
静态构造函数:
1、静态类可以有静态构造函数,静态构造函数不可继承。
2、可以用于静态类,也可用于非静态类。
3、无访问修饰符、无参数,只有一个static标志。
4、不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
什么时候适合用static修饰
- 当变量需要被共享时可以将变量定义为静态变量。
- 当方法需要被反复调用时可以将方法定义为静态方法。
- 当一个类中包含的成员都是静态时可以将类定义为静态类。
使用static时需要注意的地方
- 静态类中的所有成员也必须是静态。
- 非静态类中的成员可以是静态也可以是非静态
- 一个静态的函数内部只能使用该函数外部的静态成员。
- 一个类中的公开静态成员,在另外一个类中通过直接使用类名点的形式调用这个成员。
什么时候定义静态类与普通类:
一般这个类经常被调用,很频繁被调用,定义成静态的就不用每次给他实例化了,直接用类去调用可以了,像工具类一般都定义成静态的,这样不用每次实例化了
2、普通类
- 类本身是一种抽象的数据类型,是对某一事物的整体描述和定义, 我们平时new出来的对象, 就是通过在普通类的模版上产生的对象.
- 类中包含静态的属性(属性)和动态的行为(方法)
- 抽象类是在普通类的基础上又抽象了一些.
- 不含抽象方法,可以直接实例化。
3、抽象类
抽象类的基本概念:
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。
而抽象类是指在普通类的结构里面增加抽象方法的组成部分。
抽象方法:
那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。
而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
抽象类的总体概括:
1、含有abstrct修饰词的类是抽象类。
2、抽象类有构造器,但是它自身不可实例化,必须通过具体子类(子类实例化时才调用父 类的构造器)。
3、抽象类的成员方法有抽象的也有普通的,具体的子类必须实现所有抽象方法, 否则子类也是抽象类。
抽象类的使用原则:
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
- 抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
- 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。)
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
范例:
package com.wz.abstractdemo;
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{//B类是抽象类的子类,是一个普通类
@Override
public void print() {//强制要求覆写
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
a.print();//被子类所覆写的过的方法
}
}
结论:
-
抽象类继承子类里面有明确的方法覆写要求,而普通类可以有选择性的来决定是否需要覆写;
-
抽象类实际上就比普通类多了一些抽象方法而已,其他组成部分和普通类完全一样;
-
普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。
虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。
4、接口
接口的总体概括:
1、接口是绝对的抽象,可以说是抽象类的特例,但它没有构造器
2、接口所有方法都是抽象方法,方法默认是public abstrct, 成员变量默认是 public static final
5、内部类
更新中。。。
6、普通类、抽象类和接口的区别
抽象类和接口的区别:
- 抽象类有构造方法 ,而接口没有。
- 抽象类和普通类一样可以定义各种访问类型成员变量(包括静态的),而接口的成员变量都默认是public static final。
- 抽象类可以有普通的成员方法,方法访问类型定义任意,而接口成员方法都默认是 publuc abstric。
- 抽象类中可以包含静态非抽象方法,接口中不能包含静态方法。(static与abstract不能同时用,用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用必须在子类overriding后才能使用)
- 子类只可以继承一个父类,但是可以实现多个接口。
- 抽象类着重类别的抽象,而接口着重对行为功能的抽象。
项目 | 抽象类 | 抽象接口 |
---|---|---|
方法 | 可以存在抽象方法,也可以存在方法的实现 | 只存在抽象方法 |
成员变量 | 可以包含各种类型的成员变量(属性) | 只可以是public abstract类型的成员变量 |
能否有静态代码块 | √ 可以有 | × 不能有 |
- | 模板式设计: 更改公共内容只需要更改抽象类就好了 | 辐射式设计: 接口变更,实现这个接口的类也必须变更 |
抽象类和普通类区别:
- 都有构造函数,但是抽象类不可实例化,必须通过实例化子类时才会调用父类构造器。
- 抽象类可以没有抽象方法,也可以有普通方法;但是普通类一定没有抽象方法 。
- 抽象方法不可以是static的,但普通方法可以。
- 普通子类继承父类必须重写所有抽象方法。