一.方法重载与重写:
1.重载(Overload):
在一个类里,定义了若干个相同名称的方法,并且只有参数列表不同:参数个数或数据类型不同
2.重写(Override):
父类已经实现了某方法,子类又重新实现了该方法,就是重写
二.基本数据类型和引用数据类型
1.基本数据类型:基本数据类型就是一般化的对象定义,存储的是对象的实际值
2.引用数据类型:只要是需要new出来的对象,不论是自定义类还是其他封装类产生的,都是引用数据类型
→举例:数组、枚举、封装类(基本数据、String等)、接口、类等
→引用数据类型不保存对象实际值,只存储数据的引用(引用存放在栈中,实际数据存放在堆中,需要到堆中找值)
三.方法的基本内存原理
1.栈内存:主要用于存储方法调用和局部变量
- 采用先进后出(LIFO)的方式管理数据,即最后进入栈的数据最先被取出
- 在方法调用时动态分配栈帧(Stack Frame),包括方法参数、局部变量和操作数栈等
2.堆内存:
主要用于存储对象实例和数组
- 堆是一种树形结构,对象在堆中分配的位置不是连续的,而是散落在不同的位置上
- 通过 `new` 关键字在堆上动态分配内存,即所有通过 `new` 关键字创建的对象都存储在堆中
四.方法参数传递
1.基本数据类型传递:
结论:传递基本数据类型时,传递的是**实参**,形参改变不会影响实参的值
2.引用数据类型传递:
结论:引用数据类型传递参数时,传递的是**地址值**,形参的改变会改变实参的值
五.构造方法
1.构造方法形式:没有返回类型,与类名相同,可以有参/无参构造
2.构造方法调用:没有人为定义时,系统会创建默认构造方法;人为定义好之后,系统就不会再使用默认的(如果一旦定义了有参构造器,无参的也就没有了,系统默认也是无参的,所以需要自己再创建)
3.有参、无参构造方法可同时存在,也就是构造方法可以重载
→Maze m=new Maze( ); 创建对象时就是JVM调用构造方法才产生的
六.标准JavaBean类
固定要求:
1.类名、属性、方法名要见名知意,驼峰命名
2.属性要private
3.至少两个构造器(无参、含全部参数)
4.提供每个成员变量对应的setXXX和getXXX方法
七.三种对象内存图:
1.三种内存空间
方法区把创建的类文件提前存储进去
2.两个引用指向同一对象
这时相当于把对象1的地址赋给了对象2,两个对象共用一个堆内存空间
八.成员、局部变量
解释:因为对象是new出来的,所以对象内存是堆内存,而成员变量属于类本身,实际上也就属于对象,所以内存也是堆内存;因此生命周期也是和对象创建销毁有关的
九.上、下转型变量
1.上转型:
(1)形式:将子类的对象向上转化为父类的对象:A a=new B( );
注意必须B继承A类或者实现A接口,否则不能成立
这种转换往往是自动的,因为子类继承父类,就认为父类对象可以访问子类方法,不需要显式地标记转换操作符
(2)运行原理:编译器要求上转型变量只能访问父类方法,即便它指向子类对象引用;但是子类如果重写父类方法,那么调用这样的方法只会运行子类的而不会运行父类
(3)意义:通过这种变化可以实现多态。比如Animal ani=new Dog(),ani变量现在属于Dog对象,如果有其他的动物类,就可以把ani变量赋为其他对象,从而实现多态,还不需要每次都创建新的动物变量,节省效率
2.下转型:
(1)形式:将父类对象再转换为子类对象,一般是在已经上转型之后
由于运行可能抛出ClassCastException异常,需要利用instanceof检查对象是否是子类的类型或者利用try-catch进行异常处理,即:
//方案1
if (myAnimal instanceof Dog)
{ Dog myDog = (Dog) myAnimal;
myDog.fetch(); // 访问子类特定方法
}
//方案2
Animal animal = new Animal();
try { Dog dog = (Dog) animal; // 可能会抛出ClassCastException
// 进行后续操作
} catch (ClassCastException e) {
// 异常处理代码
e.printStackTrace();
}
(2)意义:由于上转型变量只能访问父类方法,因此可通过下转型恢复为子类变量,再去访问子类特定方法
十.instanceof关键字
1.作用:用于检查对象是否是特定类的实例或者是否实现了特定接口
2.应用:
(1)上转型时判断是否为父类的实例
(2)在下转型之前要事先进行类型判断
十一.this、super关键字
1.this:
(1)this作用:区分成员变量和局部变量
this调用的属性表示成员变量
(2)this本质:代表方法调用者的地址值
所以this调用的变量也就是调用了那个方法的地址指向的内存单元里的变量,即成员变量
2.super: `super` 关键字在子类中是用来访问父类的构造方法、成员变量和成员方法的
(1)在子类的构造方法中,可以使用 `super()` 调用父类的构造方法。这种调用必须是构造方法的第一条语句
(2)用`super`来访问父类中的成员变量,特别是在子类中有同名变量时,可以通过 `super` 来区分
(3)利用`super` 调用父类中被子类重写的方法
十二.static关键字
1.作用:表明被修饰的成员属于类本身,而不是类的实例
2.情形:
(1)静态变量:它们属于类的一部分,而不是类的每个实例的一部分。所有该类的实例共享同一个静态变量的值。静态变量在第一次被访问时被初始化,且只会初始化一次
如果某一个实例改变了静态变量的值,那么其他实例调用时也会改变;可以直接通过类来调用,就不必再创建实例
(2)静态方法:静态方法属于类本身,可以直接通过类来调用,静态方法不能被重写
(3)静态代码段:
static {
// 静态代码块,在类加载时执行 }
※静态方法中只能访问静态变量和调用静态方法,不能直接访问类的非静态成员
十三.final关键字
1.修饰类:使一个类成为最终类,这样的类不能被继承(适用于那些不希望子类修改或者扩展其行为的情形,可以维护类的稳定性与可用性)
2.修饰方法:使该方法成为最终方法,即不能被子类重写(保持方法的逻辑不被子类修改,维持稳定性与可用性)
3.修饰变量:这个变量是一个常量,只能被赋值一次;一旦赋值之后,不能再被修改
部分截图/总结来源:黑马程序员
我的笔记:Obsidian摘录