- Java类及类的成员:属性、方法、构造器、代码块、内部类
- 面向对象的三大特征:封装性、继承性、多态性、(抽象性)
- 其它关键字:this、super、static、final、abstract、interface、package、import
1、面向过程(怎么做)和面向对象(谁来做)
1.1 定义
1.2 面向对象的三大特征
1.3 人把大象装进冰箱例子
1.4 完成一个项目(或功能)的思路
1.5 面向对象的两个要素
- 类:对一类事物的描述,是抽象的、概念上的定义(比如人是一类)
- 对象:实际存在的该类事物的每个个体,因而也称为实例(instance)。(比如张三、李四)
注意:
- 面向对象程序设计的重点 —> 类的设计
- 类的设计 —> 类的成员的设计
2、Java语言的基本元素:类和对象
2.1 设计类,其实就是设计类的成员
属性 = 成员变量 = field = 域、字段
方法 = 成员方法 = 函数 = method
创建类的对象 = 类的实例化 = 实例化类
2.2 类和对象的使用(面向对象思想落地的实现)
1、创建类,设计类的成员
2、创建类的对象,new的那一步
3、通过“对象.属性”或者“对象.方法”调用对象的结构
注:
- 如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
- 意味着,如果我们修改了一个对象的属性a,不会影响另外一个对象的属性a。
3、对象的创建和使用
3.1 举例
典型代码:
Customer cust1 = new Customer();
Customer cust2 = new Customer();
Customer cust3 = cust1;
//没有创建一个对象,共用堆空间中的一个对象实体
说明:
- 如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
- 如果我们修改一个对象的属性a,则不影响另一个对象属性a的值。
3.2 练习
程序:
package com.atguigu.java;
/*
*
*/
public class TeacherStudent {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "Tom";
student1.age = 18;
student1.major = "电子信息";
student1.interests = "打篮球";
String studentInfo1 = student1.say();
System.out.println(studentInfo1);
//*****************************
System.out.println();
Teacher teacher1 = new Teacher();
teacher1.name = "Rose";
teacher1.age = 28;
teacher1.teacherAge = 4;
teacher1.course = "英语";
teacher1.say();
}
}
class Student {
// 属性
String name;
int age;
String major;
String interests;
// 方法
public String say() {
String studentInfo = name + "的年龄:" + age + "\n专业:" + major + "\n兴趣:" + interests;
return studentInfo;
}
}
class Teacher{
//属性
String name;
int age;
int teacherAge;
String course;
//方法
public void say() {
System.out.println(name + "老师的年龄:" + age + "\n已经当老师:" + teacherAge + "\n教授课程:" + course);
}
}
运行结果:
Tom的年龄:18
专业:电子信息
兴趣:打篮球
Rose老师的年龄:28
已经当老师:4
教授课程:英语
3.3 对象的内存解析
3.4 JVM内存结构
- 编译完程序以后,生成一个或多个字节码文件。
- 使用JVM中类的加载器和解释器对生成的字节码文件进行解释运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。
《JVM规范》 - 虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中。
- 堆:我们 new 出来的结构(比如数组、对象)加载在堆空间中。补充:对象的属性(非 static的)加载在堆空间中。
- 方法区:类的加载信息、常量池、静态域
4、类的成员之一:属性
4.1 属性(成员变量) vs 局部变量
1、相同点
(1)定义变量的格式:数据类型 变量名 = 变量值
(2)先声明,后使用
(3)变量都有其对应的作用域
2、不同点
(1)在类中声明的位置不同
- 属性:直接定义在类的一堆{}内
- 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
(2)限修饰符的不同
- 属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省(pubilc)、protected —> 封装性。
目前,声明属性时,都是用缺省就可以了 - 局部变量:不可以使用权限修饰符。
(3)默认初始化值的情况
- 属性:类的属性,根据其类型,都有默认初始化值。
整形(byte、short、int、long),0
浮点型(float、double),0.0
字符型(char),0(或’\u0000’)
布尔型(boolean),false
引用数据类型(类、数组、接口),null
- 局部变量:没有默认初始化值
意味着,在调用局部变量之前,必须进行显式赋值
形参在调用时,赋值即可
(4)在内存中加载的位置
- 属性:加载到堆空间中(非static)
- 局部变量:加载到栈空间中
4.2 补充:回顾变量的分类
方式一:按照数据类型
方式二:按照在类中声明变量的位置
5、类的成员之二:方法
比如:Math类:sqrt()\random()…
Scanner类:nextXxx()…
Arrays类:sort()\toStrng()\equals()…
5.1 举例
public void eat(){}
public void sleep(int hour){} //有形参,无返回值
public String getName(){}
public String getNation(String nation){} //有形参,有返回值
5.2 方法的声明
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
注意:static、final、abstract 来修饰的方法,后面再讲
5.3 说明
3.1 关于权限修饰符:默认的权限修饰符先都使用public
- Java规定的4种权限修饰符:private、public、缺省、protected —>封装性再细说
3.2 返回值类型:有返回值 vs 没有返回值
- 如果方法有返回值,则必须在方法声明时指定返回值的类型,同时,方法中需要使用return关键字来返回指定类型的变量或常量。
- 如果方法没有返回值,则方法声明时,使用void表示,通常没有返回值的方法中,不使用return
- 如果使用return表示结束该方法,return后面不能声明表达式。
3.3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
3.4 形参列表:方法可以声明0个,1个,或多个形参
- 格式:数据类型1 形参1,数据类型2 形参2,…
3.5 方法体:方法功能的体现
5.4 return关键字的使用
1、使用范围:使用在方法体中
2、作用:
① 结束方法
② 针对于有返回值类型的方法,使用"return 数据"方法返回需要的数据(只适用于有返回值类型的)
3、注意点:return关键字后面不可以声明执行语句
5.5 方法的使用
- 可以调用当前类的属性或方法。
- 特殊的:方法a中调用方法a,递归调用,需要有终止条件。
- 方法中不可以定义方法