一、JDK,JRE,JVM的关系
JDK: Java的开发工具包,包含JRE ;
JRE: Java语言编写的程序的运行环境,包含JVM;
JVM: Java虚拟机,它是整个Java实现跨平台最核心的部分,所有的Java程序首先会被编译成 .class(字节码文件),然后在JVM上被执行
二、四个访问修饰限定符
private 私有的,只能被自己内部调用;
default 默认,可被同包中的类调用;
protected 受保护的,可被同包中的类和所有的子类调用;
public 公开的,可被所有的类调用;
三、几个关键字解析
static
1、修饰属性
当 static 修饰变量时,该变量被称为静态变量。即该变量可被所有的类对象调用,也可直接使用类名调用;
2、修饰方法
当 static 修饰方法时,该方法被称为静态方法。即该方法可被所有的类对象调用,也可直接使用类名调用;(静态方法中不能使用 this 关键字)
3、修饰代码块
当 static 修饰代码块时,该代码块被称为静态代码块。静态代码块会在类首次主动使用时优先执行。
4、修饰内部类
当 static 修饰内部类时,该内部类被称为静态内部类。(在下面进行详细解释)
final
1、修饰类
当final 修饰类时,表示当前类是无法被继承的;(final和abstract是矛盾的)
2、修饰属性
当final 修饰属性时,表示当前变量只可被赋值一次且生命周期内不可被改变。final 修饰基本数据类型时,表示其为常量且值不可改变;final 修饰引用数据类型时,表示其不能再指向其他对象,但是被引用的对象的值是可以改变的;
3、修饰方法
当 final 修饰方法时,表示当前方法无法被重写;(private 修饰的方法都隐式指定为 final的)
4、修饰方法参数
当 final 修饰方法参数时,表示在整个方法中都不能修改该参数的值;(如果是引用类型表示其不能再指向其他对象,但是被引用的对象的值是可以改变的)
this
this表示当前对象的引用
1、使用 this 调用成员变量;
2、使用 this 调用方法;(this 不可在静态方法中使用)
3、使用 this 调用构造方法(在构造方法内部使用this关键字调用其他构造方法时,必须写在第一行,只能调用一个且仅一次构造方法)
super
super表示父类对象的引用
1、使用 super 调用父类的成员变量;(子类中使用父类中的值)
2、使用 super 调用父类的方法;(字类中使用父类的实现过程)
3、使用 super 调用父类的构造函数。隐式调用:会自动调用父类的无参构造函数;显示调用:使用super()主动调用父类的构造函数,并且必须写在第一行只能调用一个且仅一次构造方法,如果含有参数则在 **()**中填入参数即可。
四、类、接口、抽象类
类 (类是一个模板,它描述一类对象的行为和状态)
抽象类 (使用abstract关键字定义)
- 抽象类不能直接实例化对象(即不能new一个新对象)
- 抽象类一般包括一个或几个抽象方法,抽象方法就是abstract修饰的方法
- 抽象方法只有方法名,没有方法体(就好比一个模板)
- 抽象类的子类必须重写父类的抽象方法(重写写入方法体)子类才能真正实例化,否则子类也是一个抽象类
- 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类
接口 (使用 interface 关键字定义,使用 implements 关键字实现)
- 接口也不能直接实例化对象(即不能new一个新对象)
- 接口中所有的访问权限都是 public 的
- 接口中的方法全部都是抽象方法 (public abstract )
- 接口中的属性全部都是静态常量 (public static final)
- 接口不可以继承任何类,但可以继承接口
- 一个类实现一个接口,必须实现所有的抽象方法,否则该类只能是抽象类
一个类可以继承类,但可以实现多个接口
内部类
静态内部类
使用static修饰的内部类,不依赖于外部类存在
1、静态内部类中可以写的内容
- 静态代码块和实例代码块
- 静态属性和非静态属性
- 静态方法和非静态方法
2、外部类如何调用静态内部类中的属性和方法
- 通过创建静态内部类的示例来调用静态内部类的非静态属性和非静态方法
- 通过静态内部类的类名直接待用静态内部类的静态属性和静态方法
3、静态内部类如何调用外部类的属性和方法
- 静态内部类可以直接调用外部类的静态属性和静态方法
- 静态内部类可以通过创建外部类实例的方法调用外部类的非静态属性和非静态方法
4、如何创建静态内部类的实例
- 在外部类中:静态内部类名 name = new 静态内部类名();
- 在非外部类中:外部类名 . 内部类名 name = new 外部类名 . 内部类名();
实例内部类
依赖外部类存在
1、实例内部类中可以写的内容
- 实例代码块
- 非静态属性
- 非静态方法
成员内部类中不能有静态属性和方法但可以有静态常量(即用static final修饰的属性),因为在类加载时会初始化static修饰的内容,而成员内部类必须依赖于内部类对象,即成员内部类要在外部类加载之后加载,所以不能包含静态的变量和方法。使用final修饰的静态变量类加载时会自动初始化其值,将其作为一个常量,所以可以出现在内部类中。
2、外部类如何调用实例内部类中的属性和方法
- 外部类可以通过创建成员内部类实例来访问成员内部类中的属性和方法
3、实例内部类如何调用外部类的属性和方法
- 成员内部类可以直接访问外部类的所有属性和方法
如果成员内部类B与外部类A包含同名的成员,那么在类B中, this.v表示类B的成员, A.this.v表示类A的成员。
4、如何创建实例内部类的实例
- 在外部类中创建:内部类名 name = this.new 内部类名();
- 在非外部类中创建:外部类名 . 内部类名 name = new 外部类名() . new 内部类名();
匿名内部类
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。
五、面向对象的三大特征
封装:指将对象的属性和实现的细节隐藏起来,只对外界提供访问的方法
封装的优点:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。