面向对象
对象内存图
两个对象调用同一方法
**变量与方法分离:**堆内存只负责对方法的顺序调用,在执行期间创建的变量存放在堆内存中,创建的方法存放在方法区中。
成员变量与局部变量
-
位置不同
-
作用范围不同
-
初始值不同
-
内存位置不同
成员变量在堆内存、局部变量在栈内存
-
生命周期不同
封装
概述
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的
方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
步骤
1、private关键字修饰成员变量
2、使用getXxx、setXxx方法访问成员变量
this关键字
指向当前对象所在的类
构造方法
作用:当对象被创建时,使用构造方法实现对成员变量的赋值。
public class Student {
private String name;
private int age;
// 无参数构造方法
public Student() {}
// 有参数构造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
标准代码–JavaBean
static关键字
用static关键字修饰的成员方法,称为静态方法,使用时直接用类名调用即可,不需要创建类对象。例如Math.abs
注意事项:
-
静态方法可以直接访问类变量和静态方法
-
静态方法不能直接访问普通成员变量和普通成员方法。但成员变量可以直接访问静态变量和静态方法。
-
静态方法中,不能使用
this
关键字 -
思考以上注意事项时,主要考虑变量与方法的生命周期
静态方法、变量内存图
- 随着类的加载而加载(是不是随着类的释放而释放?)
- 存储在一块固定的内存区域(静态区),可以被直接调用
- 优先于对象存在,可以被所有对象共享(程序在执行时首先加载静态方法和变量,且在全部生命周期中不释放)
继承
注意:
-
当子类中出现于父类同名的变量时需要有
super
关键字来访问父类变量 -
当子类中出现与父类同名的方法时需要用方法重写(Override)
-
继承可以实现对父类方法的继承以及在类中添加新方法(以下是经典的使用场景)。
-
只能是单继承
class Phone { public void sendMessage(){ System.out.println("发短信"); } public void call(){ System.out.println("打电话"); } public void showNum(){ System.out.println("来电显示号码"); } }
class NewPhone extends Phone { //重写父类的来电显示号码功能,并增加自己的显示姓名和图片功能 public void showNum(){ //调用父类已经存在的功能使用super super.showNum(); //增加自己特有显示姓名和图片功能 System.out.println("显示来电姓名"); System.out.println("显示头像"); } }
注意:
1、子类方法覆盖父类方法,必须保证子类权限大于等于父类权限
2、子类方法覆盖父类方法时需要保证除了函数体之外,其余部分均相同。
父类空间优先于子类空间创建,子父类均利用自己的构造函数实现初始化(在子类构造函数中默认会有super();
继承父类构造方法,达到这样的效果)
用法
this用来调用成员变量和成员方法
super用来调用父类变量与父类方法
抽象类
父类被子类继承并且重写成不同的形式,其父类的方法体的存在就没有意义了,此时我们使用抽象方法来修饰父类的方法
注意:
- 包含抽象方法的父类是抽象类
- 不包含抽象方法的父类也可以用
abstract
来修饰成抽象类 - 抽象类必须被实现才能使用
接口
接口是Java语言中一种引用类型(其他引用类型还有?),不同于类内部包含了成员变量、构造方法、成员方法,接口内部主要是成员方法
使用接口时,不能直接利用接口创建对象,只能被实现(implement),之后再利用实现之后的类来创建对象,调用方法。
其基本格式如下:
public interface 接口名称 {
// 抽象方法
public abstract void method();
// 默认方法 其中default不能省略,供子类调用或者重写
public default void method() {
执行语句
}
// 静态方法,无法重写,无法继承,只能被直接用接口名调用
public static void method2() {
// 执行语句
}
// 私有方法,只能被接口内部的默认方法来调用
private void method3(){};
}
- 对于抽象方法,必须重写所有抽象方法,同名的抽象方法只需重写一次
- 默认方法有重名时,必须重写一个默认方法
- 静态方法不会冲突,因为他们都在自己的接口类中
- 接口之间也可以继承
- 接口中不可以定义成员变量,但是可以定义不可以改变的常量
public static final
- 接口中没有静态代码块(?)
多态
实现父类,重写方法从而实现多态
转型:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。
final关键字
final关键系修饰的语句,表示不可改变:
-
类:被修饰的类不能够被继承
-
方法,被修饰的方法不能被重写
-
变量,被修饰的变量不能被改变
在修饰未被赋值局部变量时,被修饰的局部变量仅能被修改一次
修饰符权限
public | protected | default | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中 | √ | √ | √ | |
不同包中子类 | √ | √ | ||
不同包的无关类 | √ |
内部类
将一个类定义在另一个类的内部
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类访问内部类成员,必须建立内部类对象
- 创建内部类对象方法:外部类.内部类 对象名 = new 外部类型().new 内部类型();
匿名内部类
ew 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
将一个类定义在另一个类的内部
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类访问内部类成员,必须建立内部类对象
- 创建内部类对象方法:外部类.内部类 对象名 = new 外部类型().new 内部类型();
匿名内部类
ew 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
以上是对Java封装、继承、多态以及相关基础类的总结。
在这一部分我需要在脑海中构建出java方法和类的各种关系以及相关关键字的作用