第一部分 Java面向对象
1.开发环境搭建及开发工具eclipse使用
eclipse快捷键:
Ctrl+1 快速修复
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
2.类和对象
什么是类
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
类与对象的关系:
对象是具体的,真是存在的物种。
类是对象的抽象出来的,理论上的概念物种
类: 我说现在已经开始公布HUAWEI手机 P50的概念机,那就是说这款手机还没有实体机存在,只是官方还在设计这个手机。 其中包含:颜色、尺寸、分辨率等。以上说的是这款概念机中的属性、 另还包含:上网、打电话、发短信、拍照、看电视等。这是在说的是这款概念机所具有的功能,也就是行为!
对象:
我说现在已经开始公布HUAWEI手机 P30的实体机,那就是说这款手机已经存在实体机。 但是有这款手机之前,也一定会先有该机的设计图或是概念机。
3. 成员变量和局部变量区别
- 定义类:就是定义类的成员,包括成员变量和成员方法。
- 成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
- 成员方法:和以前定义方法几乎是一样的。只不过把static去掉,static的作用在面向对象后面中再详细 讲解。
接下来通过一幅图来认识一下成员和局部
- 在类中的位置不同 【
重点
】
- 成员变量:类中,方法外
- 局部变量:方法中或者方法声明上(形式参数)
- 作用范围不一样 【
重点
】
- 成员变量:类中
- 局部变量:方法中
- 初始化值的不同 【
重点
】
- 成员变量:有默认值
- 局部变量:没有默认值。必须先定义,赋值,最后使用
- 在内存中的位置不同 【
重点
】
- 成员变量:堆内存
- 局部变量:栈内存
- 生命周期不同 【
重点
】
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4. 数据类型
Java的数据类型划分为两大类:基础数据类型和引用数据类型
5.构造函数
定义格式:
权限修饰符 构造方法名(参数列表){ // 方法体 }
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。
- 如果你不提供构造方法,系统会给出无参数构造方法。
- 如果你提供了构造方法,系统将不再提供无参数构造方法。
- 构造方法是可以重载的,既可以定义参数,也可以不定义参数
6.函数
函数定义格式:
权限修饰符 [修饰符] 返回值类型 方法名(参数列表){ //代码省略... return 结果; } // 上方用方括号包括的修饰符可以有、也可以没有。 // 修饰符有抽象修饰符abstract、有静态修饰符static、也有线程同步锁方法 synchronized 等。
- 修饰符: public static 固定写法
- 返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者
- 参数列表:方法在运算过程中的未知数据,调用者调用方法时传递
return:将方法执行后的结果带给调用者,方法执行到 return ,整体方法运行结束
- 注意: 不能在 return 后面写代码, return 意味着方法结束,所有后面的代码永远不会执行,属于无效代码。
- 注意: 返回值类型,必须要和 return 语句返回的类型相同,否则编译失败
如何定义方法
首先要确定返回值类型和参数列表
调用方法的流程图解
函数重载
- 方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返 回值类型无关。
- 参数列表:个数不同,数据类型不同,顺序不同。
- 重载方法调用:JVM通过方法的参数列表,调用不同的方法。
7. 成员变量的初始化
数据类型 |
默认值 | |
基础数据类型 | 整型【byte,short,int,long】 |
0 |
浮点型【float,double】 | 0.0 | |
字符【char】 | '\u0000' | |
布尔【boolean】 | false | |
引用数据类型 | 数组、类、接口 | null |
8. this关键字
我们发现 setXxx
方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意 了呢?代码如下:
public class Student { private String name; private int age; public void setName(String name) { name = name; } public void setAge(int age) { age = age; } }
经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了 setXxx() 的形参变量名后,方 法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无 法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。
this代表的是当前类对象。
9. static关键字
概述
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。
也就是说,既然属于类,就可以不靠创建对象来调用了。
9.1 静态成员变量、静态成员变量初始化
静态成员变量:
当 static 修饰成员变量时,该变量称为类变量。
该类的每个对象都共享同一个类变量的值。
任何对象都可以更改 该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
静态成员变量初始化
静态成员只会在每个类中初始化一次 【静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次】
【Java笔试题】:构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?答:先后顺序是:静态成员变量、成员变量、构造方法。
原因:
a. 当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法。
b. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减):
① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;
② 父类优先于子类进行初始化;
③ 按照成员变量定义顺序进行初始化,即使变量定义散布于方法定义中,它们依然在任何方法(包括构造方法)被调用之前先初始化。
9.2 静态成员方法
- 当 static 修饰成员方法时,该方法称为类方法 。
- 静态方法在声明中有 static ,建议使用类名来调用,而不需要 创建类的对象。
- 调用方式非常简单。
10. JVM对象内存结构
Java中的内存分配:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
具体划分为如下5个内存空间:
- 栈:存放局部变量
- 堆:存放所有new出来的东西
- 方法区:被虚拟机加载的类信息、常量、静态常量等。
- 寄存器(和系统CPU相关)
- 本地方法区
11. Java 继承
概述:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要 继承那一个类即可。
如图所示:
其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。 继承描述的是事物之间的所属关系,这种关系是: is-a 的关系。例如,图中兔子属于食草动物,食草动物属于动 物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
定义:
继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。
子类可以直接 访问父类中的非私有的属性和行为。
好处:
1. 提高代码的复用性。
2. 类与类之间产生了关系,继承是多态的前提。
继承的格式:
通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:
class 父类 { ... } class 子类 extends 父类 { ... }
继承演示,代码如下:
/* * 定义员工类Employee,做为父类 */ class Employee { String name; // 定义name属性 // 定义员工的工作方法 public void work() { System.out.println("尽心尽力地工作"); } } /* * 定义讲师类Teacher 继承 员工类Employee */ class Teacher extends Employee { // 定义一个打印name的方法 public void printName() { System.out.println("name=" + name); } } /* * 定义测试类 */ public class ExtendDemo01 { public static void main(String[] args) { // 创建一个讲师类对象 Teacher t = new Teacher(); // 为该员工类的name属性进行赋值 t.name = "小明"; // 调用该员工的printName()方法 t.printName(); // name = 小明 // 调用Teacher类继承来的work()方法 t.work(); // 尽心尽力地工作 } }
杨校老师课堂之Java面向对象知识点整理集锦2:https://developer.aliyun.com/article/1543050