java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一、前言
一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见,有什么不对的地方还请大家指出,一起讨论共同成长。
Java面向对象:
(1) java内存结构
1 栈
特点:有序的内存空间(先进后出原则).
创建方式:由程序平台自身创建.
存储内容:基本数据类型(简单数据类型)的值. 存放对象的在堆空间上的地址.
个数问题:java程序执行过程有很多个栈,往往为一个代码段(各种大括 号) 创建一个栈空间.
周期问题:若对应的代码段被执行完毕,则栈空间将马上回收
2 堆
特点:一种无序的内存空间.
创建方式:可以由程序员自己创建或申请(mailoc).
用途:用于存放一些较复杂的数据信息(自定义类型).
个数问题:Java程序的执行过程中只有一个堆(对所有方法和执行过程共享).
周期问题:从java虚拟机启动开始,一直到java虚拟机执行结束.
3 JVM内存结构全景图
堆:全局共享的无序存储空间(从JVM启动开始创建到JVM结束销毁).
栈:有序的存储空间(方法加载执行被创建分配,直到方法执行完毕栈被释放).
方法区:将所有类中的方法内容都存储起来,为执行提供代码信息(从JVM启动开始创建到JVM结束销毁).
执行上下文:用于存储即将执行的方法的调用关系和执行顺序的空间.
注:对象存放在堆中,引用则存放在栈中(因为栈存放数据时具有先进后出的特点,为了避免数据的重复挪用,则把数据的引用存在在栈中)。
(2) java对象的组成
引用:存储在栈上的.
实例:存储在堆上的.
封装目的:隐藏实现的细节,降低开发的复杂度.
封装常用手段:定义方法.
(2)面向对象封装
特点:将封装体系加强,让封装有多个层次
封装层次:
类封装:根据类型所具备的功能,将相关的一组功能方法实现,并组合在一起,根据抽象的类型,将该类型的特征都封装在一起(一般不对类以外的代码公开)
包封装:
1 什么是包:一个代码封装单位,它将各种类型组织在一起,一个用于存放java文件的一个文件夹.
2 使用包:
定义语句:在类文件的第一行:package 包名;引用包下的类:import 包名.类名(两个类不在同一包时下使用);
访问修饰符:
概念:访问修饰符是用于定义类、方法、属性的可访问级别的关键字
访问级别:不同包之间的访问、同包之间的访问、子类对父类的访问、类内部之间的访问.
修饰符:
public:公有的,制定类、方法、属性可以被任何代码直接调用(包括不同包的情况).
default:(没有定义修饰符)只有在同包下的类才可以调用.
protected:保护的,可以让同包或者其子类调用.
private:私有的,只能让本类调用
访问级别顺序:private<default<protected<private
注:关于继承和修饰符的问题:发生在方法重写时,子类中重写的方法,其访问修饰符必须比父类更大(更开发).
四、抽象类、接口:
(1) 抽象类
1 什么是抽象类:一个允许有抽象定义存在的类,可以像普通类一样有属性、成员方法、构造函数.
2 怎样定义抽象类:访问修饰符 abstractclass 类名{……}
抽象方法:只有方法的声明,没有方法体
访问修饰符 abstract返回类型 方法名(参数列表);
3 抽象类构造对象:抽象类不能通过new 关键字直接实例化对象,抽象类可以作为父类被子类继承,子类必须实现父类中的抽象方法
注:抽象类可以定义引用,可以用这个引用去访问子类实例对象.
常见问题:
- 抽象类的构造方法能否定义为私有?
答:不能,若定义为私有,则子类无法继承访问父类的构造方法.
- 抽象类能否被实例化?
答:不能直接使用new实例化,但可以通过子类间接实例化
- 抽象类的构造方法能否定义为abstract?
答:不能,因为构造方法不能被子类重写。
(2) 接口
1 什么是接口:java编程技术中最抽象的数据类型,不能定义任何实现,只能给出抽象方法的声明。
2 定义接口的方法: publicinterface 接口名{}
声明抽象方法:不需要使用abstract关键字,只能定义抽象方法的声明,可以不需要使用访问修饰符—默认是public.
3 实现接口:类implements 接口名,接口名。子类必须实现接口中定义的所有抽象方法(抽象类除外)
4 接口的意义:规范子类的行为,可以为定义标准提供编程支持,为代码的动态性提供更加灵活的类型匹配和识别标准,接口可以定义为引用,指向任何一个实现了该接口的类的实例对象;技术支持:动态绑定,抽象类型的引用,根据所指向的具体实现对象不同,而动态的改变。
5 接口上的其他成员:
静态常量:
static 静态关键字:修饰属性和方法,若被此关键字修饰的成员为静态成员。什么是静态?属性的存储位置不和对象在一起,而是独立的存放,保证一个JVM中该属性的内存只分配一次,只需要通过类直接调用。方法也不属于对象,只需要通过类直接调用。
final 最终关键字:
修饰类:表示这个类不能被继承;
修饰方法:表示这个方法不能被子类重写;
修饰参数:表示在方法体的执行过程中,参数值不能发生变化。
注:接口中定义的属性必定是静态常量(用static、final修饰的),定义可以省略static、fanal关键字。
6 接口的使用方式:用于定义抽象方法,为后面的实现提供方法的定义和约束—方法接口;用于定义一组有用的静态常量—常量接口。
常见问题:
- 接口是否有构造方法?
答:没有构造方法,接口只能用来定义引用或为JVM做类型检查,不能以任何形式构造对象。
- 一个类实现了多个接口,若用其中一个接口定义引用来操作,是否可以访问其他接口上的抽象方法?
答:接口类型的引用,只能访问该接口中声明的抽象方法,其他接口的方法无法调用。
- 接口能否继承接口?
答:可以!可以通过extends关键字实现接口间的继承,允许同时继承多个接口。
(3) 接口与抽象类的关系:
1 可以使用接口来定义一组API的功能(方法).
2 可以使用抽象类将多个接口的要求整合在一起.
3 抽象类可以选择性的实现接口中定义的方法(抽象类一般扮演弗雷的角色;如果对某个功能的实现有通用或默认决绝方案是,抽象类可以选择实现;如果某个功能的实现需要与具体问题或使用场景相结合在决定的话,则抽象类可以不选择实现,再将其交给子类去考虑).
4 可以通过抽象类追加抽象方法.
五、static、final :
(1) static (定义静态属性,定义静态方法,定义静态语句块)
1 什么是静态(static)?
从程序执行开始,就创建在那,并且不会改变位置的一组存储空间(变量,属性和方法)。相对于静态,程序中的动态即:对象是动态的,每new一个对象,都会分配一个新的存储空间,同一个类型的多个对象,都有相同名称的属性,但是属性值和存储位置不同。
2 什么是静态成员?
静态成员是定义在类中,但不属于某一个实例对象专属,而是在整个程序中唯一不变的属性、方法. 静态成员的访问方式:类名.属性名、类名.方法。
3 静态属性:只分配一次内存空间,该地址被所有对象共享使用,静态属性的操作可以不依靠对象。
4 静态方法:可以直接通过类来访问静态方法;静态方法的操作可以不依靠对象;静态方法上不能使用this关键字,也不能操作非静态属性和方法。
5 静态语句块 static{…代码…}
特点:在类加载时执行(jdk1.4在JVM开始执行时自动运行,jdk1.5在有效使用类时,才会运行该类的静态语句块).但只会执行一次,不会重复执行。
内容:程序启动时需要做的初始化运算或操作,可以用来给静态属性赋值或初始化。
注意:静态语句块放在所有静态属性之后定义,为的是方便初始化所有属性,如果定义在某些属性之前,可能造成静态属性的初始化失败。
6 静态导入语句 –jdk1.5之后引入的新技术.
效果:对另一个类的import导入发生在编译阶段,而通常不是在执行阶段。(可以导入一个静态属性或静态方法)。
实现语句:import static 包名.类名.静态成员
(2) final意思是最终,指不可再发生变化.
可修饰的成员:
修饰类:访问修饰符 finalclass 类名{…} 表示该类不能被继承,但final 不能修饰抽象类和接口.
修饰属性:访问修饰符 final 类型 属性名=… 表示该属性值不能被修改,在定义时必须给定其初始值.
修饰方法:访问修饰符final返回类型 方法名(参数列表) 表示该方法在继承过程中不能被重写,不能修饰抽象方法。
修饰方法参数:访问修饰符 final 返回类型 方法名(final 数据类型 arg,final 数据类型 arg).
修饰方法变量:在定义变量时加final,则该变量在方法执行的过程中,不可修改值(相当于常量).
(3)静态常量:常量名必须大写!可以使用import static 语句导入到个引用代码中直接访问.