java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final

时间:2022-06-01 13:02:06

一、前言

一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见,有什么不对的地方还请大家指出,一起讨论共同成长。

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 语句导入到个引用代码中直接访问.