Java语言面向对象解读
一、Java面向对象的主线分析
1. 三条主线
- Java类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的三大特征:封装性、继承性、多态性、(抽象性)
- 其它关键字:this、super、static、final、abstract、interface、package、import等
2. 注意
- 面向过程(POP)(Procedure Oriented Programming):强调的是功能行为,以函数为最小单位,考虑怎么做。
- 面向对象(OOP)(Object Oriented Programming):强调具备了功能的对象,以 类/对象 为最小单位,考虑谁来做。
二、面向对象
1. 面向对象两个要素
- 类(class):对一类具有相同属性和行为的事或物的描述,是抽象的、概念上的定义
- 对象(object):是实际存在的该类事物的每个个体,因而也称为实例(instance)
思想概述;程序员从面向过程的执行者转化成了面向对象的指挥者。
2.完成一个项目或功能的(面向对象分析方法分析问题的)思路和步骤
2.1 步骤
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
2.2 注意
- 面向对象程序设计的重点是类的设计;设计类,就是设计类的成员。
- Java代码世界是由诸多个不同功能的类构成的。
三、Java 类及类的成员
1. 基本成员
- 属性 == (Field ) == 域、 字段 :对应类中的成员变量:静态特征;全局变量;
- 行为、方法 ==(Method) == 函数、过程 :对应类中的成员方法:动态特征;
2.类的语法格式
修饰符 class 类名 {
属性声明;
方法声明;
}
注意:类的正文要用{ }括起来,表征其作用域。
3.创建Java自定义类的步骤
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)、
4.类的分类
- 实体类(存储数据的类):实体类的写法是固定的。
类的方法体内,包含属性,一个显示声明的无参构造方法;和根据业务要求的带参构造方法。
每一个属性都对应着2个方法,setter和getter。一个用来赋值,一个取值。 - 业务类(处理数据的类):
5.类的访问机制:
- 在一个类中的访问机制: 类中的方法可以直接访问类中的成员变量 。
例外:static 方法访问非 static ,编译不通过 。 - 在不同类中的访问机制: 先创建要访问类的对象,再用对象访问类中定义的成员 。
四、new (创建)对象及使用
1. 面向对象思想的实现
1.1 实现思路步骤
- 创建类,设计类的成员。见 三、4 。
- 创建类的对象,new 一个对象。(类的实例化 = 实例化类)
格式:类名 对象名 = new 构造方法(参数列表); - 通过“对象.(可见)属性”或“对象.(可见)方法”调用对象的结构
注意:如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着,如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
1.2 构造器(构造方法)解读
- 构造方法语法格式: public 方法名(与类名同名)(参数列表){
方法体;
}
参数列表为空时,称为无参构造(若类中没有定义任何构造方法,系统自动提供无参构造);
反之,带参构造(若类中定义任何构造方法,系统不再提供无参构造,如需使用无参构造,需显示声明无参构造)。 - 构造方法的功用:
1.创建对象;
2.类初始化,给类的属性第一次赋值。构造方法对于同一个对象,只能调用一次。
注意:调用方式,new(惟一),没有返回值类型。(识别标志:与类同名,没有返回值类型)
五、类的内存解析
1.内存空间
- 堆(Heap):所有的对象实例以及数组都要在堆上分配。
(此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。) - 栈(Stack):是指虚拟机栈。用于存储局部变量等。方法执行完,自动释放。
局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 - 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
注意:引用类型的变量,只可能存储两类值:null 或 地址值(含变量的类型)。
2.JVM内存结构
- 编译完源程序后生成一个或多个字节码文件。
- 使用JVM中类的加载器和解释器对生成的字节码文件进行解释运行。
意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。
六、特殊
1.匿名对象
1.定义
定义:我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
(我们创建的对象,没有显式的赋给一个变量名。即为匿名对象)
例:new Person().shout();
2.使用场景
- 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
- 我们经常将匿名对象作为实参传递给一个方法调用。
特征:匿名对象只能调用一次。
七、理解“万事万物皆对象”
- 在Java语言范畴中,我们都将功能、结构等封装到类中,通过将类实例化为对象,用对象来调用具体的功能、结构Scanner,String等
文件:File; 网络资源:URL - 涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
八、代码展示
/* 要求:
* (1)创建ObjectOrientedProgramming类的对象,设置该对象的name、age和sex属性,调用study方法,
* 输出字符串“studying”,调用showAge()方法显示age值,
* 调用addAge()方法给对象的age属性值增加2岁。
* (2)创建第二个对象,执行上述操作,体会同一个类的不同对象之间的关系。
*/
public void ObjectOrientedProgrammingTest() {
// 类的实例化。即 new 一个属于类对象。用以操作类的属性和方法。
ObjectOrientedProgramming p1 = new ObjectOrientedProgramming();
//调用(操作)类的属性并赋值。
p1.name = "Tom";
p1.age = 18;
p1.sex = 1;
//调用(操作)类的方法。
p1.study();
p1.showAge();
int newAge = p1.addAge(2);
System.out.println(p1.name + "的新年龄为:" + newAge);
System.out.println(p1.age);//20
//*************************
ObjectOrientedProgramming p2 = new ObjectOrientedProgramming();
p2.showAge(); //0
p2.addAge(10);
p2.showAge(); //10
p1.showAge();
}
class InstanceTest {
public static void main(String[] args) {
Phone p = new Phone();
//p = null;
System.out.println(p);
p.sendEmail();
p.playGame();
//匿名对象
// new Phone().sendEmail();
// new Phone().playGame();
new Phone().price = 1999;
new Phone().showPrice();//0.0
PhoneMall mall = new PhoneMall();
// mall.show(p);
//匿名对象的使用
mall.show(new Phone());
}
}
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
class Phone{
double price;//价格
public void sendEmail(){
System.out.println("发送邮件");
}
public void playGame(){
System.out.println("玩游戏");
}
public void showPrice(){
System.out.println("手机价格为:" + price);
}
}