方法
成员变量和局部变量的区别
1、在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 2、在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 3、生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 4、初始化值不同 成员变量:有默认值 局部变量:没有默认值,必须定义,赋值,然后才能使用 注意事项: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
案例:
class Varialbe { //成员变量 int num; //默认值0 public void show() { //可能尚未初始化变量num2 int num2; //没有默认值 num2 = 20; //定义后必须赋值才能使用 //方法中可以使用成员变量和局部变量 System.out.println(num2); System.out.println(num); } } class VariableDemo { public static void main(String[] args) { Varialbe v = new Varialbe(); System.out.println(v.num); //访问成员变量,不能访问局部变量num2 v.show(); } }
类与对象
对象内存存储过程
类作为形式参数(理解)
如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象
匿名对象(理解)
1、没有名字的对象 2、应用场景 a、调用方法,仅仅只调用一次的时候。 b、匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。 c、可以作为实际参数传递。 3、例子:new Student().show();
类的封装
1、为了给类中的属性xxx进行赋值校验,从而产生setXxx();。(一般在这里校验) 2、由于依然可以使用 类的对象.xxx 进行赋值,从而产生 private 类型 xxx;。(private一般赋值给成员变量)
this关键字
-
- 代表当前类的引用对象
记住:哪个对象调用方法,该方法内部的this就代表那个对象
-
- this的应用场景
解决了局部变量隐藏成员变量的问题
-
- this关键字内存图解
static关键字
-
- 静态的特点
A:随着类的加载而加载
B:被类的所有对象共享
C:静态成员变量可以通过类名调用
既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
-
- 静态的内存图
静态的内容在方法区的静态区
-
- 静态的注意事项
A:在静态方法中没有this对象
B:静态只能访问静态
-
- main方法是静态的
public:权限最大
static:不用创建对象调用
void:返回值给jvm没有意义
main:就是一个常见的名称
String[] args:可以接收数据,提供程序的灵活性
格式:java MainDemo hello world java
java MainDemo 10 20 30
代码块(理解)
1、用{}括起来的代码。 2、分类: 1):局部代码块 main函数后,用于限定变量的生命周期,及早释放,提高内存利用率。 2):构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。 3):静态代码块 对类的数据进行初始化,仅仅只执行一次。 3、静态代码块,构造代码块,构造方法的顺序 静态代码块 > 构造代码块 > 构造方法
继承(掌握)
1、把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系, 这多个类就具备了这些内容。这个关系叫继承。 2、Java中如何表示继承呢?格式是什么呢? A:用关键字extends表示 B:格式: class 子类名 extends 父类名 {} 3、继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提 4、继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 5、Java中继承的特点 A:Java中类只支持单继承 B:Java中可以多层(重)继承(继承体系) 6、继承的注意事项: A:子类不能继承父类的私有成员 B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承 7、什么时候使用继承呢? A:继承体现的是:is a的关系。 B:采用假设法 8、Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单 b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子类的方法访问变量的查找顺序: 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 B:构造方法 a:子类的构造方法默认会去访问父类的无参构造方法 是为了子类访问父类数据的初始化 b:父类中如果没有无参构造方法,怎么办? 子类通过super去明确调用带参构造 子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造 让父类提供无参构造 C:成员方法 a:子类的成员方法和父类中的成员方法名称不一样,这个太简单 b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢? 通过子类对象访问一个方法的查找顺序: 在子类中找,有就使用 在父类中找,有就使用 找不到,就报错 9、数据初始化 A:一个类的初始化过程 成员变量的初始化 默认初始化 显示初始化 构造方法初始化 B:子父类的构造执行过程(分层初始化) 先进行父类初始化,然后进行子类初始化。 D:例子: /* 看程序写结果: 结果: YXYZ 问题: 虽然子类中构造方法默认有一个super() 初始化的时候,不是按照那个顺序进行的。 而是按照分层初始化进行的。 它仅仅表示要先初始化父类数据,再初始化子类数据。 */ class X { Y b = new Y(); X() { System.out.print("X"); } } class Y { Y() { System.out.print("Y"); } } public class Z extends X { Y y = new Y(); Z() { //super System.out.print("Z"); } public static void main(String[] args) { new Z(); } } 10、方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象。 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象。 方法重载能改变返回值类型,因为它和返回值类型无关。 Override:方法重写 Overload:方法重载 11、this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。 this:代表当前类的对象引用 super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员) 场景: 成员变量: this.成员变量 super.成员变量 构造方法: this(...) super(...) 成员方法: this.成员方法 super.成员方法