java基础入门(二)
类变量(静态变量)
在类中定义的变量,加上static
称为类变量,否则称为实例变量/普通变量。
性质:
- 类中使用
static
修饰的变量将会被所有同类共享。 static
类变量,在类加载时就生成了,不需要创建对象实例就可以访问(以该变量不是private
修饰为前提)。
注意事项
- 什么时候需要使用类变量?
当我们需要让某个类的所有对象对共享一个变量时可以使用。
- 类变量与实例变量的区别:
类变量是该类的所有对象共享的,而实例变量时每个对象独享的。
- 类变量的生命周期随着类加载开始,随着类消亡而被销毁。
类方法(静态方法)
类似于类变量,就是在类中定义的方法前使用static
修饰。
使用时不需要将类实例化,直接用类名.方法使用。
注意事项
- 类方法和普通方法一样,随着类加载而加载,将结构信息存在方法区
- 类方法中无
this
参数,不能使用与对象有关的关键字,如this
和super
。 - 类方法只能访问静态变量和静态方法。
- 普通成员方法可以访问静态方法和普通方法。
理解main方法
public static void main(String[] args){}
- main方法由JVM调用
- JVM需要调用类的main()方法,所以该方法的访问权限必须是public
- JVM在执行main()方法时不需要创建对象,所以该方法必须是static
- main方法会接受String类型的数组参数args,该数组中保存着执行java命令时传递给所运行的类的参数
- main方法中想要访问非静态的变量和方法需要先实例化再用。
代码块的使用
没有方法名的方法。使用格式:
static或者什么都不写 { |
相当于另外一种形式的构造器,可以做初始化操作,在使用构造器之前会调 用代码块,也就是说优先级高于构造器内的代码。可以将多次出现的重复代码放到代码块中。
注:如果使用static修饰代码块,则总共只会调用一次。如果是普通代码块,则每创建一次这个类都会执行一次。
创建对象时,在类中的调用顺序:
- 调用静态代码块和静态属性初始化
- 调用普通代码块和普通属性初始化
- 调用构造方法
当创建一个子类对象时(继承父类),调用顺序为:
- 父类的静态代码块和静态属性
- 子类的静态代码块和静态属性
- 父类的普通代码块和普通属性
- 父类的构造方法
- 子类的普通..
- 子类的构造方法
final关键字
final可以修饰类、属性、方法和局部变量,final修饰的属性又叫做常量。
用法:
- 当不希望类被继承时。
- 当不希望父类的某个方法被子类覆盖或重写时。
- 当不希望类的某个属性的值被修改时。
- 当不希望某个局部变量被修改时。
注意事项
final修饰的属性一般用XX_XX_XX命名(大写,字母间使用下划线隔开)
final属性在定义时必须赋初值,赋值的位置可以在:
定义时直接赋值
在构造器中赋值(仅限非static)
在代码块中赋值(static时使用静态代码块)
如果一个类已经是final类了,其中的属性和方法就不要用final修饰了
final不能修饰构造器
final往往与static一起使用,效率更高,不会导致类加载
包装类(Integer、Double、Float、Boolean等)都是使用final修饰的,不可被继承
抽象类
当在父类中声明了一个方法,但是不知道该如何实现时,就可以不实现,而是把该方法声明为一个抽象方法,同时该类变成一个抽象类。
- 用abstract关键字来修饰一个类/方法时,这个类就叫做抽象类/方法
- 抽象类的价值更多作用在于设计,是设计者设计好后,让子类继承并实现抽象类
- 抽象类不能被实例化
- 抽象方法一定在抽象类中,但是抽象类不一定有抽象方法
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也是抽象类
- 抽象方法不能使用private、final和static修饰,因为这三个关键字都与重写相违背(用这三个关键字修饰方法不许被修改)
例子:
abstract class Animal{ |
接口
接口就是给出一些没有实现的方法,封装到一起,当某个类要用时,根据具体情况把接口中的方法写出来。
java8之后,接口中可以有方法的具体实现,但是非静态方法需要使用default
修饰。
接口中的方法都默认使用public abstract
修饰,属性默认使用public static final
修饰。
语法:
public interface 接口名{ |
注意事项
- 接口不能被实例化(同抽象类)
- 一个类可以同时实现多个接口
class X implements Y, Z {}
- 接口不能继承类,但是可以继承其他接口(接口与接口之间是继承关系,接口与类之间是实现关系)
interface A extends B, C {}
- 接口的修饰符只能是public和默认
接口与继承
当子类继承父类时,自动拥有父类的功能。但因为一个子类只能继承一个父类,如果子类需要扩展功能,就可以通过实现接口的方式扩展。可以理解为实现接口是对java单继承机制的扩展。
内部类
一个类的内部又完整的嵌套了另一个类,被嵌套的类叫做内部类。
局部内部类
局部内部类定义在外部类的局部位置,通常在方法或代码块中,有类名。
特点
- 可以直接访问外部类的全部成员,包括私有
- 不能添加访问修饰符,因为局部内部类的地位相当于一个局部变量。但是可以用final修饰
- 作用域:在定义它的方法或代码块中
- 外部类想访问局部内部类的成员需要先new一个再访问
- 如果外部类中成员和局部内部类中成员重名,访问时使用就近原则,如果想访问外部类,可以使用
外部类.this.成员
访问
匿名内部类
匿名内部类没有类名(但是底层实现的时候有名字),不仅是一个类,还是一个对象,所有它同时拥有类和对象的特性,可以当做实参直接传递。
特点与局部内部类类似。
语法:
类或接口 变量名 = new 类或接口(参数){ |
成员内部类
成员内部类定义在外部类的成员位置,没有static修饰。其定位是一个类成员,可以添加任意修饰符。并且作用域为整个外部类体。
特点
假设Outer
类中有一个名为Inner
的成员内部类,当外部其他类想使用成员内部时:
Outer out = new Outer(); |
其他使用方式跟其他内部类相同。
静态内部类
静态内部类是在成员内部类的基础上,有static修饰,有内部类和静态方法的全部特性。
当外部其他类想访问静态内部类时,因为是静态的,所以不需要实例化,通过类名直接访问:
Inner inn = new Outer.Inner();