我的故事你说,我的文字我落,我值几两你定,我去何方我挑。
代码块是类中唯一的一段可以自动执行的代码区域,代码块中内容我们无法手动调用执行,只能让其自动执行。
[static] {
代码块体;
}
【注意】
在一个类当中可以存在多个代码块,多个代码块再执行的时候会从上而下依次执行。
package codeblock;
public class Demo01 {
{
System.out.println("第一个非静态代码块");
}
static {
System.out.println("第一个静态代码块");
}
{
System.out.println("第二个非静态代码块");
}
static {
System.out.println("第二个静态代码块");
}
public Demo01() {
System.out.println("构造器执行了");
}
public static void main(String[] args) {
Demo01 d = new Demo01();
Demo01 d1 = new Demo01();
}
}
非静态代码块:
调用任何一种构造方法构建对象之前先会执行一次非static的代码块,非静态代码块调用一次构造函数执行一次
执行时机:构造函数执行之后、构造体执行之前
静态代码块:
在类加载的时候就会执行静态代码块。静态代码块只有在类加载的时候会执行一次,以后就再也不执行了。
非静态代码块可以调用所有的属性和方法
静态代码块只能调用static的属性和方法
Java中属性又名成员变量,而变量必须初始化之后才能使用,局部变量必须得手动初始化才能使用,属性可以不用手动初始化,因为JVM内存在类加载或者创建对象的时候会给没有初始值的属性赋予一个默认值,通过默认值完成初始化过程。
虽然属性没有被赋值的时候内存会自动初始化,赋予默认值,但是final修饰的属性不在此JVM自动初始化行列之内。因为final修饰的属性不可变更值,如果final修饰的属性是一个引用数据类型,按道理会赋予null值,但是null值因为final原因不可更改,导致NullPoniterException的产生。
常量数据又分为静态常量属性和非静态常量属性
静态常量属性可以在两个位置进行初始化操作:
非静态常量属性可以三个位置进行初始化操作:
如果类中存在常量属性、常量属性需要赋值操作才能使用,赋值操作一般都建议在代码块中赋值使用。
内部类是声明在类中的一个类,内部类是用来扩充外部类的功能的。
访问控制修饰符 [static|final] class 类名 {
类体:类的五大组成成分
}
静态内部类:外部类加载的时候会加载。
非静态内部类:外部类创建对象的时候才会加载,非静态内部类中不能存在静态内容。
静态内部类的创建对象方式:
new 外部类.内部类(实参);
//静态内部类创建对象
InnerClass02 i1 = new OuterClass.InnerClass02();
非静态内部累的创建对象方式
new 外部类().new 内部类(实参);
//非静态内部类创建对象
InnerClass01 i = new OuterClass().new InnerClass01();
内部类也可以声明在方法内部
package是Java中的包,包就等同于一种文件夹,是用于分类存放不同类型的代码的。在Java中一旦把一个类声明到某一个包下,那么会在这个类的首行使用package包名.包名……的形式声明类是这个包下的类。
在Java当中,包名是可以多个层级的,包下可以有类,也可以有另外一个包。
JRE,Java运行时环境,包含了JVM以及Java的基本类库-Java提供的一些常用类,常用类库都在rt.jar压缩包当中,
【注意】
在Java当中,编写代码的时候,经常会遇到使用自己编写的其他类,或者JRE提供的基本类库、或者是第三方给我们提供的代码,但是这些代码可能不在同一个包下,如果我们要使用不同包下的代码,必须在当前类的package声明之下,class声明之前使用import全限定类名的方式将这个类导入到我们的当前类中,我们才能去使用。
全限定类名就是包名.包名.xxxx.类名
Java中声明的每一个类,默认会给我们导入两个包,这两个包不需要我们手动导入,全自动化完成,本类所在的包、java.lang包
import xxx.*: 将xxx包下的所有Java类给导入进来,xxx包下的子包中的内容不会引入进来。
继承是Java用于解糊合的一种手段,如果多个类当中出现了重复性的行为方法,那我们就可以把这些方法抽取到一个父类当中,然后由子类去继承父类,子类一旦继承父类之后,子类就会拥有父类中声明的这些方法(不一定是所有的)。
class Son extends Father{
}
【注意点】:Java是单继承的,一个字类只能继承一个父类,但是Java支持多层继承,子类继承父类、父类继承另外一个父类,那么子类会同步继承另外一个父类的能力.
属性可以被子类继承的,子类能不能有一个和父类同名的属性?
子类可以拥有和父类重名的属性,默认情况下使用子类的属性,如果子类要使用父类的属性,必须使用super.属性名
的方式调用父类的属性名,但是有一个前提,super关键字不能使用在static方法中。
最好不要存在和父类同名的属性。
public void print(String name) {
System.out.println(name);//输出的距离最近的局部变量
System.out.println(this.name);//输出的是本类的属性
System.out.println(super.name);//输出的是父类的属性
}
子类可以继承父类的方法,子类也可以有自己的方法。
子类如果继承父类的方法时,觉得父类的方法不满足我的需求,可以在满足某种规则的前提下将父类的方法给重写了。
子类也具备这个能力,只不过就是父类方法中定义的方法体不满足子类的要求,所以子类需要把父类定义的方法的方法体给修改了。这样的方法成为方法重写;
一旦方法重写了,方法上最好加上一个@Override注解。
重写方法必须满足以下几个规则:
必须位于子类和父类中,而且是子类重写父类的方法
子类的方法名以及方法的参数列表、方法的返回值类型必须和父类保持一致
@Override
public void shouted() {
System.out.println("狗汪汪汪 啊呜的叫");
}