1:jvm(虚拟机)三种内存区
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
1:“方法区”/ “静态区”:存储代码片段 .class文件,类的信息(静态变量)
最先有数据,因为类最先被加载",方法的代码片段存储在方法区中,但方法执行过程中的需要的内存在栈中"
2:"栈:"方法执行 , 就会压栈,(局部变量)
3:"堆:"new出来的对象都在堆中,堆中存储对象,存储this,(实例变量)
垃圾回收(GC机制)主要针对堆 ``
2:成员变量和局部变量
成员变量:
1、成员变量定义在类中,在整个类中都可以被访问。
2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3、成员变量有默认初始化值。
局部变量:
1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3、局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。
3 封装,继承,多态
1.1:封装
封装是把对象的所有组成部分组合在一起,封装使用访问控制符将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。适当的封装可以让代码更容易理解和维护,也加强了代码的安全性。
1.2:封装实现2步:
1 属性私有化
2 对外设置set get方法
私有的可以在本类中访问,在其他类中必须使用set和get方法
2继承
2.1继承的作用
基本作用:子类继承父类,代码可以服用
主要作用: 有了继承才有后期的方法覆盖和多态机制
2 .2:继承的相关特性
优点:!!!!!!
1:B类继承A类
A类称为超类(superclass) ,父类,基类
B类称为子类(subclass),派生类,扩展类
2: java只支持单继承,
3: java不支持多继承,但可以间接继承
4: java 中,子类继承父类,除构造方法不能继承之外,其他都可继承。
但是私有的属性不能在子类中直接访问,(通过间接的手段来访问,
例如 : 可以通过方法来访问私有属性)
5 :java中的类没有显示继承任何类,则默认继承Object类,
Object类是java语言提供的根类,
缺点!!!!!
耦合度高,父类发生改变会立即影响到子类
3 多态
一:"多态" :父类型引用指向子类型对象
包括编译和运行阶段
编译阶段:绑定父类的方法。
运行阶段:动态绑定子类型对象的方法。和底层堆内存的对象有关
只有先编译了才能看运行 '
编译看左,运行看右
java允许向上转型,也允许向下转型
1:向上转型
子--->父 (自动转换类型)
2:向下转型(存在风险) 需要添加强制类型转换符
父--->子(强制类型转换)
加if 用'instanceof' (运行阶段动态判断) 运行时的地址
语法: (引用 instanceof 类型)
注意:向上 向下转型是引用数据类型的称呼
自动转换类型 和 强制类型转换是基本数据类型的称呼
3 :什么时候向下转型?
需要调用子类特有的方法
4 :
多态的作用:
降低程序的耦合度,提高程序的扩展力
4 super 和this
1: "this"是一个关键字,保存当前对象的地址,存储于堆中,
一个对象一个this ,"this."引用+点
2: this只能使用在实例方法,不能使用在静态方法
因为实例方法是通过"类."访问的
3:什么时候定义为实例方法?静态方法?
如果方法直接访问实例变量,则定义为实例方法
也就是说 : 访问对象级别的,定义为实例方法
4 :
什么情况this不能省略?
实例方法和构造方法时,区分局部变量和实例变量时不能省略
5: this()
通过当前构造方法中调用另一个本类的构造方法, 并且this()必须在第一行
6:只要负责调用的方法a和被调用的方法b在同一个类中:
this. / 类名. 可以省略
super
super()
1: 当一个构造方法第一行:
没有this()又没有super(),默认会有一个super(),
表示通过子类的构造方法调用父类的无参数构造方法
2:
当一个子类方法调用多个父类的构造方法,实际只创建了一个对象
-----相当于super()把构造方法继承过来了 ,但并不是继承
3:super(实参)干嘛的???
初始化当前对象的父类型特征 ,还可以访问父类型的私有属性
4:super.的用途??
区分父类和子类 同名属性/变量 时不能省略
子有,父有,在子类中访问‘父类特征’ 用super.
既可以访问属性,也可以访问方法
5:小知识:
输出'引用.' 会输出引用.的tostring()
6: super 不是引用。不保存内存地址。不指向任何对象
super 只是代表当前对象内部的父类型特征的关键字
7 : super 可以出现在实例方法和构造方法,不能使用在静态方法
'切记!!!!!私有方法只能在本类中访问
5 方法覆盖和方法重写
方法重载:
1: 在同一个类中
2: 方法名相同
3: 参数列表不同(个数,顺序,类型)
4: 与返回值,修饰符列表无关
“方法覆盖”:
1:当子类对父类继承过来的方法进行"方法覆盖",会执行覆盖后的方法
2 :方法覆盖的规则:
1: 子类和父类要有继承关系
2: 返回值相同,方法名相同,参数列表相同
3: 访问权限不能更低,可以更高(就是修饰符列表权限的排序)
4: 重写之后的方法不能比之前的方法抛出更多的异常,可以更少
3 : 注意:
1:方法覆盖只针对于方法,与属性无关
2:私有方法无法覆盖
----private修饰只能在本类中使用
3:方法覆盖不能覆盖构造方法
-------因为构造方法不能继承
4:方法覆盖只针对实例方法,静态方法覆盖没有意义
----因为静态方法跟对象无关,有static限制,调的还是父类的方法
----调用还得用类名. 调用,类名.调用谁就是谁的方法
注意:
'方法覆盖和多态不能分开
多态要有对象,而静态方法中不含对象,一般不探讨静态方法覆盖
4 :
Object中的toString()方法的覆盖
toString()方法作用:将java中的对象转换成字符串
6 抽象类与接口
抽象类
2.1 :抽象类定义:属于引用数据类型,是一个类,
在类名前加 abstract 关键字就行了
2.2 :抽象了无法实例化,无法创建对象,所以抽象类是用来被子类继承的
2.3 :final 和 abstract 不能联合使用,是对立的两个关键字
2.4 :抽象类的子类可以是抽象类,也可以是非抽象类
2.5 :抽象类无法实例化,但抽象类有构造方法,这个构造方法供子类使用
2.6 : 抽象类中不一定有抽象方法,抽象方法一定出现在抽象类中
2.7 : 抽象方法定义 : 在返回值类型前加abstract ,并且方法名括号后加分号';'
2.8 : 一个非抽象的类继承抽象类,必须把抽象类中的抽象方法实现,
要对抽象方法进行覆盖/重写/实现
接口的基本语法
3.1 :接口是一种引用数据类型,编译之后生成class文件
3.2 :接口是完全抽象的
3.3 :接口怎么定义:
[修饰符列表] interface 接口名 {}
3.4 :接口支持多继承
3.5 :接口中只能有 常量(public static final 可以省略)
和 抽象方法(抽象方法的public abstract可以省略)
3.5 :接口中的方法都是抽象方法,所以接口中的方法不能有方法体