复习内容

一.程序流程控制
1.流程控制的三种情况:
方法调用、选择、循环
2.布尔表达式
布尔逻辑:与、或、异或、非
逻辑运算符:
和:逻辑和 :&& 按位和 :&
或:逻辑或 :|| 按位或 :|
异或:^
非:逻辑非: ! 按位非 :~
3.选择结构:
单分支if:
If(条件表达式){
语句块;
}
双分支if:
If(表达式){
语句块1;
}else{
语句块2;
}
多分支if:
If(表达式1){
语句块1;
}else if(表达式2){
语句块2;
}else if(表达式 3){
语句块3;
}…….
多分支switch case:
Switch(变量){
Case 变量值:
语句块;
Break;
}
4.循环结构:
循环结构分为三种(while、do while、for)又分为先验循环和后验循环
先验循环:先验循环有for循环和while循环两种
后验循环:do循环
二.类、对象和包
1.类:
类是具备某些共同特征的实体的集合,它是一种抽象的概念。
2.对象:
对象可以是问题域中出现的任何人、事物或者实体,简单点说就是“东西”。
3.类和对象的关系:
类是对象的抽象,对象是类的实例;类是模板,对象才是真正具体的存在。
4.结构化编程和面向对象编程
结构化编程:程序员将一个大的问题分解成更小的任务,然后为每个更小的任务编写一个过程(或函数)。
面向对象编程:程序不是围绕着要解决的任务来设计,而是围绕着要解决的问题中的对象来设计。这种编程方法被称为面对对象编程。
5.二者区别:
6.结构化编程中,程序围绕着要解决的任务来设计;面向对象编程中,程序围绕着问题域中的对象来设计。
7.编写一个java类
向类中添加全局变量:
对象的属性是相关类中的全局变量,全局变量组成部分如下:访问修饰符+数据类型+全局变量名称 ;
向类中添加方法:
一个对象的行为是相关类中的方法,类中方法的组成:访问修饰符+返回值+方法名称(必须是一个有效的标识符返回值)+参数列表(在括号中出现)+方法的定义
实例化对象:
在Java中,new关键字用于实例化一个对象。new运算符在内存中创建一个对象,并返回对新创建的对象的一个引用。只要我们的程序保留对该对象的一个引用,那么这个对象将一直保留在内存中。
类只是一个模板,对象才是真正具体的存在。
访问对象的属性和方法:
当我们使用new关键字实例化一个对象时,系统为会该类中的每个成员变量和方法分配内存。如果要访问该对象的成员变量和方法,就需要使用点运算符来。
8.This引用:
每个对象可以使用this关键字引用它本身。如果一个类的方法需要访问该类本身的成员变量或其它方法,就应该使用this引用。
9.包:
包是为了更好地组织类,用于区别类名的命名空间。
10.包的用途:
提供了一个组织类的机制;
为包中的类提供了一个命名空间。
11.包的创建和使用:
第一层(公司:com 机构:ori 政府:gov 教育机构:edu))
第二层:公司名字、机构名字、团队名字……
第三层:项目名称;

三、对象的行为
1.方法调用栈 :
方法调用栈中最先执行的代码放在最下面,最后执行的代码放在最上面,先执行的最后结束,后执行的最先结束。
2.方法签名:
方法的组成:访问修饰符 可选修饰发 返回类型 方法名 参数列表 抛出的异常列表
3.执行一个方法时的三种情况:
(1).方法返回一个值。在这种情况下,一个基本数据类型或引用类型被传回给方法的调用者。
(2).方法不返回一个值。在这种情况下,返回值被声明为void
(3).方法抛出一个异常给方法的调用者。
4.形参:
形参是定义方法的时候,该方法所携带的参数
5.实参:
当我们调用方法时传递给形式参数的数据称为实际参数
6.按值调用
当实际参数传递给形式参数时,实际参数的数据被复制给形式参数。
不管传递给方法的实际参数是什么类型,相关的形式参数都会得到该数据的一份拷贝,这就是按值调用的工作原理。
实际参数传递到所调用的方法的形参的过程叫值传递
Java里面只有值传递。
7.方法的重载:
方法的重载就是相同的行为,不同的实现。根据不同的参数列表来进行区分。
特点:
参数的个数可能不一样,参数的类型可能不一样,参数的顺序也可能不一样;方法名一样。
使用了static的方法叫静态方法,未使用的叫非静态方法。静态方法在调用时不需要实例化对象,可直接由(类.方法)调用;而非静态方法不行,非静态方法在调用时必须实例化对象。
8.访问器
访问器(属性访问方法):访问私有属性的时候Sun公司提供的一个访问方法;
public + 返回类型 + get(方法名) /布尔类型的变量不能以is开头,因为其访问器是:is(方法名)
9.修改器
修改器(属性修改方法):修改私有属性的时候Sun公司提供的一个修改方法。
Public + void + set(属性名)
10.构造器
构造器是一个特殊的方法,它在类创建一个实例时被调用执行。构造器:Public(访问修饰符) + 类名(方法名)(){
}
构造器作用:产生一个对象。构造器只有在结合了new的时候才会在堆中产生对象。This在构造器中使用方法:this()调用类里面的其它构造器,根据括号内的参数决定。This方法只能放置在构造器的第一行。
语法特点:没有返回类型,void都没有;构造器中方法名和类名必须相同;构造器可以不写,编译器会自动给我们生成一个公共无参的构造器。
构造器如果一旦显示的编写了,那么编译器将不会再给我们产生任何构造器。
构造器产生对象的步骤:
(1).如果其他程序使用new 构造器() 调用构造方法,那么构造器就会去内存中申请内存空间(对象那么大),用来存放对象;(2).去申请的内存空间中为属性分配对应的存储空间;(3).对属性进行初始化;(4).执行构造其中编写的代码。
有参构造:书写构造器时需要传入参数
定义任何有参构造的潜规则:定义有参构造之前,先定义无参构造。
有参构造作用:产生对象、初始化成员变量。
无参构造:书写时不需要传入参数
11.内存空间
栈: 存放内容:局部变量、方法参数、返回地址
堆: 新创建的对象(new 对象)
方法区: 常量池(常量)、代码区(编译过后的代码)
本地方法区: API
程序计数器: 代码执行顺序、方法栈
数组
1.数组概念:
数组是存储在一片连续内存区间中的类型相同的元素的集合,数组是集合的一个特例。
2.数组与集合区别:
数组内只能放置相同类型的数据,而集合中可放置不同类型的数据;
数组存储区间是连续的,而集合可不是。
3.数组组成:
书写方式:数据类型+【】 = new 【】(方框内放置数组长度如 20)
数组中的每个元素必须是相同的数据类型,并且通过索引进行分区。数组中的第一个元素的索引为0;
4.数组的特点(也是其缺点):
(1).数组中间只能存放相同类型的数据;
(2).数组定义好了之后,内存中元素的从存放是连续的;
(3).数组的大小需要在定义的时候就固定好,一旦确定将无法再次修改。
5.创建一个数组的步骤:
(1).声明一个数组变量:(数组的声明方式跟其他的引用数据类型声明变量一模一样):数据类型【】 变量 = null; 或者 数据类型 变量【】 = null; 一般使用前者;
(2).使用new关键字初始化数组,并指定数组的大小。
6.遍历:
循环操作数组叫做遍历:访问数组元素与操作数组时,特别注意,不要超出数组所分配的空间。否则会出现运行时异常:ArrayIndexOutOfBoundsExcepTion
Java语言的数组与其他语言数组的不同之处在于:java中的数组是对象。这样做的好处之一为:java中的每一个数组都有一个length属性来代表数组的大小,可以极大地减少数组访问越界的可能性。(length属性是只读属性,不能更改)
7.数组初始化:
在Java中,我们可以用一条语句声明一个数组引用,实例化一个数组,并且填充数组元素,这个过程称为数组初始化。数组初始化程序在创建数组时,不需要使用new关键字。数组中的元素使用大括号列出,元素和元素之间用逗号分隔开。
例如,如下的数组初始化程序创建了一个有五个String类型元素的数组:String[] names = {“张三”,”李四”,”王五”,”赵六”,”吴八”}(数组初始化只能写在同一排)
数组初始化程序只能用在声明新数组引用时。这种方式,使用场景是小数组,内容不多的情况下,推荐使用。
8.多维数组:
与一维数组一样,多维数组也是对象,需要一个引用。语法也可以由一维数组过度而来。
例如:
一维:int[] b = new int[5];
二维int[][] b = new int[5][5];
多维则依此类推
9.数组复制:
因为数组的大小是固定的,所以在使用数组时,经常不得不创建一个更大或更小的数组,然后将已存在的数组的内容复制到新的数组中。我们可以编写一个for循环将一个数组的内容复制给另一个,也可以用System类中的静态方法arraycopy()。
arraycopy()方法的签名如下:
public static void arraycopy(Object source, int sourcePos, Object destination, int destinationPos, int length)
sourcePose指示要复制的源数组,而destinationPos指示要复制给哪个目标数组。length参数代表要复制的元素的数目。
10.Java文档工具javaDoc
Java语言一个独特且特别有用的功能就是javadoc工具,使用该工具,可以获取Java源代码中的注释,并生成HTML页面。这就鼓励开发者在代码中添加注释,因为产生的HTML网页可以让同事和其他需要了解一个类的人所用,并且不需要看实际的源代码。
我们可以使用如下javadoc标记之一来表述特定类型的注释信息:
@author:表示源代码的作者名称。
@depracated:表示随着程序版本的提升,当前类成员已经过期,仅为了保证兼容性依然存在,以此告之开发者不应再用这个API。
{@docRoot}:代表当前页面要输出到的针对于根目录的相对路径。
@exception:被方法所用,列出抛出的异常。
{@link 包.类#成员的链接文字}:创建一个对特定类成员的链接。
{@linkplain 包.类#成员的链接文字}:如{@link}相同,但是用纯文本字体代替了代码字体。
@param:用于描述方法的形式参数。
@return:用于描述方法的返回值。
@see:创建一个“参见”XX条目的链接,如类、方法、变量等。
@since:描述成员存在或改变时的版本号。
@serial、@serialField和@serialData:用于串行化用途。
@throws:与@exception标记相同。
{@value}:用于显示常量静态字段的值。
@version:描述类的软件版本。
继承
1.继承的起源
继承源自于现实生活
如果不用继承代码可能出现:混淆属性,以及行为,也可能出现代码重复以及扩展性无法提高的情况。
2.继承的概述:
将一些具有相同属性和行为的类,中间的相同属性和行为抽象到一个公共类中,然后让子类去继承公共类的方式。
被继承的类成为父类、基类、超类
子类又称为派生类
子类可以继承父类除了私有的属性和行为以及构造函数之外的其它内容。
子类还可以扩展行的属性以及新的行为。甚至还可以重写父类的方法。
继承是类和类的继承而不是对象和对象的继承
3.继承的实现
关键字:extends
java中只允许单继承,不支持多继承,但不是否认杂交的就不好
优点:安全性高,层次结构清晰
缺点:丰富度降低
后续,java可以支持多实现
4.继承的优点
代码的可重用性;
子类可以扩展父类的属性和方法;
父类的属性和方法可用于子类;
设计应用程序变得更简单。
5.类和类的关系
继承
实现
部分和整体
组合
聚合
关联关系
依赖关系
6.子类实例化
用关键字new来实例化
但是要记住并非像创建一个父类对象,然后再创造一个子类对象,实例化子类时先执行父类的构造器,再执行子类的构造器,但是只创建了一个对象(先划分父类属性的存储空间,然后再叠加子类的存储空间)。
7.所有类的超类Object
所有类往上推,总有一个类的父类是Object。
8.方法重写
继承父类的方法并且改写父类方法的实现成为方法的重写
重写是编译时多态的一种体现(编译时就能看到效果),而重载是运行时多态的一种体现(运行时才能看到效果)。故重载又称为静态的多态表现,重写又称为动态表现。
方法重写有三个条件
(1).子类方法的返回值类型、方法名和形式参数列表,必须和父类中的是相同的。
(2).访问修饰符必须不小于父类中的访问修饰符。(public>protected>final>private)
(3).子类中重写的异常不能抛出比父类更多的异常。
9.重载与重写
方法重写:(重写必须有继承的动作)子类中的方法与父类中的方法相同(方法名称、参数列表、返回类型)
方法重载:一个类中的方法与另一个方法相同,参数列表不同。
10.== 号与equals区别
==: 两边的数据如果是基本数据类型,那么直接比较值是否相等;如果两边的数据类型是引用数据类型,那么比较引用是否相等。
equals: 默认情况下,调用的是Object.equals(),这个方法比较是对象的引用是否一致,但是在某些特殊的业务场景中,我们也可以重写该方法。
11.构造方法与继承
不像一个超类的成员,超类的构造方法不能被它的子类继承。
super与this
super()代表父类的构造方法
Super()这一行代码必须放置在第一行,如果程序不显示写出,编译器也会默认加上。
super只可操作继承自父类的那一部分属性和行为。(不代表父类,代表继承自父类的那一部分属性和行为)。
this()代表本类的其它构造函数
这一行代码必须放置在第一行,如果程序不显示写出,编译器不会默认加上。
This:(代表本类产生的对象自身)
可操作本类所有属性;
可操作本类所有方法;
可操作继承的来自于父类的属性和方法。
12.最终类和最终方法
final关键字
final类:一个类可以声明为最终类的。
最终类不能被有子类,即不能被继承;
final方法:一个方法可以声明为最终的。
最终方法可以被继承但是不能被重写;
final修饰属性过后,属性变为常量,不能被修改。
类的高级概念
1.访问修饰符的概念
用来定义类中国的属性和行为,能够被其他类在什么情况下可以进行访问的符号
访问修饰符
Private 私有 只能本类访问
Defaule 默认 跟类位于同一个包下面的所有类都可以访问
Protected 受保护的 同包中的类和其他包中的子类,都可以访问
Public 公共的 任何包中的类,都可以访问
访问级别:private - -> default - -> protected - -> public
2.封装的概念
用于组装类的属性和行为,并且通过访问修饰符以及方法的包装来隐藏类的成员的方式
封装的优点
(1).类的创元变量通过访问器和修改器进行控制,可以成为只读或者是只写,不再是外部可以任意操作
(2).类可以通过对方法的控制,完成对成员变量的内容的整体控制,比如:口令(天王盖地虎),年龄控制,大小控制……
(3).类还可以改变一个成员变量的数据类型,从而让类的调用不能轻易的,凭借经验就判断出类的成员变量,比如birthday ,变成int year,month,day;
3.Static 可选的修饰符
static在修饰全局变量时,全局变量可以被称为静态变量或类变量,经过static修饰的全局变量已经和对象无关,直接上升称类的变量,它的数据已经不存在每个单独对象身上,而是存在方法区的数据块的静态区域中。非静态成员变量必须要等到实例化对象以后才能调用,而静态成员变量,在类加载完成之后就已经可以直接调用。
在修饰方法的时候,对应的方法可以被称为类方法,与类变量一样,同样已经与对象无关,直接上升为类的行为。非静态方法必须等到实例化对象之后,采用调用,而静态方法,在类加载之后,就可以直接调用。
Static修饰的内容存在于内存的时机是类加载的时候。
Static在修饰全局变量是,一般用于修饰常量,主要目的:节约堆内存,将变量定义在静态区域中,而不是每个对象的自身。
Static在修饰方法时,一般用于修饰工具类的工具方法,比如:Math类,Arrays类,StringUtils类、包括超级数组类。
静态方法中,不能访问非静态成员(属性、方法) 其原因是:
(1).静态方法在加载时,非静态属性还没发调用。
(2).假设可以调用,那么若果存在成千上万个对象,我在调用谁的属性或者是调用谁的行为?
Static无法修饰构造函数,因为static修饰的属性或者行为都与对象无关,但是构造函数是专门产生对象的函数。
4.初始化块
实例初始化块:主要用于初始化成员变量,他执行在构造函数执行代码的第3到第4步之间。可以使用有参构造替代实例初始化块
一般是对象实例化时才会执行,并且是实例一次执行一次,
静态初始化块:主要用于在类加载时,做一些前期的准备工作,比如:检查数据库是否连接正常,检查配置文件是否存在,或者是提前读取某些文件内容到内存中来……
它的执行实在类加载时就开始执行。
5.成员内部类
定义在类的内部,作为类的组成。
静态内部类:用static修饰的成员内部类。特点:将该内部类与对象脱离关系,直接上升为类的关系,效果等同于类变量,类方法。地位:等同于全局变量的地位。
成员内部类内部可以使用外部类所定义的所有成员变量(包括成员变量和成员方法)。
成员内部类的访问,必须要通过外部类的实例调用才能访问。
6.局部内部类
定义在方法的内部,作用范围进局限于这个方法内。
匿名内部类
匿名内部类是一种特殊的局部内部类,匿名内部类没有类名字,也没有类的专门声明。
这种类的类声明与对象的创建语法合为一体,看起来像在产生对象,但是除了产生对象,实际上它还声明了这个类;匿名内部类是一个为了唯一对象而定义的一个类,如果我们需要创建一个类的对象,又不想去知道类的名字的时候我们就可以使用匿名内部类;地位与部局部变量一样,不能添加访问修饰符。
局部内部类无法被方法外部访问,局部内部类内部无法通过 this. 访问外部类的成员 (此时的this.代表的是局部内部类的实例),但是可以通过 外部类.this.访问外部类的成员,包括外部类所定义的行为;
7.Java文件与类文件关系
(1).java文件中包含几个类就对应的产生几个相应的类文件
(2).java文件的名称不一定和类文件的名称保持一致:兄弟类类文件的命名规则就是它类名称自身 ”类文件.class“;成员内部类类文件的命名规则就是“外部类 . c l a s s 1(1是出现次数)局部内部类.class”
3.在一个java文件中只允许出现一个public修饰的外部类。其他的外部类都是default

猜你喜欢

转载自blog.csdn.net/qq_43046901/article/details/82561517