Java基础应用编程——|Java基础应用编程—— 面向对象基础
本章内容
节知识点 掌握程度难易程度
面向对象编程思想面向对象编程思想理解
类的定义什么是类掌握
类的格式掌握
类的成员掌握
对象的创建和使用什么是对象理解
创建对象掌握
构造器 掌握难
使用对象掌握
匿名对象理解难
变量的作用域掌握
this关键字 this关键字 掌握
垃圾回收机制垃圾回收机制原理掌握难
面向对象编程思想 面向过程编程
传统的C语言属于面向过程编程。面向过程解决问题的思路:通常是分析出解
决问题所需要的步骤,然后用方法把这些步骤一步一步实现,最后一个一个依
次调用方法来解决。
案例:ATM提款机终端系统(面向过程编程)
步骤1:输入密码,系统判断是否正确,如正确,进入取款界面,如错误,提示重新输入。
步骤2:进入取款界面,输入取款金额,系统判断余额是否足够,如不足,提示;如足够,点钞。
步骤3:吐出钞票,打印票据。
面向过程编程考虑的问题是程序运行的流程,主要是程序的算法,而数据只是在必要的时候插入到算法中间。
面向对象编程(OOP:Object-Oriented Programming )
从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。面向对象解决问题的思路:通常是把构成问题域的事务分解成各个对象,给对象赋予相应的属性和行为,通过多个对象的相互协调来解决问题。建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 。支持面向对象编程是Java 语言的重要特点。
案例:ATM提款机终端系统(面向对象编程)
根据要解决的问题,可以抽象出如下对象:
客户
银行卡
现金
票据
这些对象没有先后顺序,共同作用才构成了整个系统。我们只要用代码设计出
这几个类型的对象,然后让他们互相通信、传递消息就可以完成系统功能。
面向对象编程思想实际上就是一种运用对象、类、继承、封装、聚合、关联、
消息、多态性等概念来构造系统的软件开发方法。
面向过程
系统以过程/方法为中心来组织
过程间相互发送数据
过程的执行动作与数据被明显的分离
关注的焦点在于数据结构、算法和执行步骤
过程通常难以被复用。
面向对象
系统以对象为中心来组织
对象相互间发送消息
相关的属性和行为被统一到对象上
关注的焦点是对象及对象的职责
使得系统构建更容易,易维护,易扩展,易复用
解决问题的方式更接近人的思维方式,使人更容易理解
从面向过程到面向对象,不仅仅是编程方式的改变,更重要的是思考方式的改变。 面向对象基本概念
抽象(abstract):
从事物中舍弃个别的非本质特征,抽取共同的本质特征
只考虑与问题域相关的信息,而忽略与问题域不相关的部分
对象(object):是系统中用来描述客观事物的一个实体。
可以是有形的,也可以是无形的(如一个客户,一张银行卡,窗体中的一个按钮等等)
对象是构成世界的一个独立单位
具有自己的静态结构(属性)和动态行为(方法)
每个对象有自己的唯一标识
类(class):
类是一组具有相同属性和行为的对象的抽象,
类的作用是用来创建对象,对象是类的一个实例
类和对象的关系
抽象和具体的关系。每一个类在某一时刻都有零个或更多的实例, 类是生成对象的模板一个类定义了使用哪些数据来描述属性,每一个对象都有相应的属性值数据,
一个类通过一系列方法来定义行为,这些方法能在每个对象中被激活
面向对象主要特征
封装(encapsulation):
所谓封装是把对象的属性和行为结合在一个独立的系统单位内部
尽可能隐蔽对象的内部细节,只向外部提供接口
降低对象间的耦合度
封装的重要意义:
使对象能够集中而完整地描述并对应一个具体事物
体现了事物的相对独立性,使对象外部不能随意存取对象的内部数据
继承(inheritance):
也称泛化,继承性是子类自动共享父类属性和方法的机制,在定义和实现一个
类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类
所定义的内容作为自己的内容,并加入自己若干新的内容继承简化了人们对事物的认识和描述,有益于软件复用,是OO技术提高软件开发效率的重要原因之一是类之间的一种关系,一般类与特殊类之间的关系继承关系的语义:“is a kind of”
多态(polymorphism):
指同一个命名可具有不同的语义OO方法中,常指在一般类中定义的属性或方法被特殊类继承之后,可以具有
不同的数据类型或表现出不同的行为,对于子类,可用不同的方法替代实现父
类的服务的方法
类的定义 什么是类
把相似的对象划归成一个类。在软件设计中,类,就是一个模板,它定义了通用于一个特定种类的所有对象
的属性(变量)和行为(方法)。
文章图片
什么是类? 示例 XiyoujiRole.java
西游记游戏软件中的游戏人物
孙悟空:孙悟空的武器是金箍棒,战斗力五颗星,耐力五颗星
唐僧:唐僧没有武器,战斗力为零,耐力五颗星
猪八戒:猪八戒的武器是耙子,战斗力四颗星,耐力两颗星
沙僧:沙僧的武器是月牙铲 ,战斗力三颗星,耐力四颗星
文章图片
类的格式
[类修饰符] class 类名
{
类的成员
…
}
修饰符一般为public,也可以没有修饰符。
注意类名的命名规范。类名一般大写
类的成员:
成员变量(属性)
成员方法(方法)
嵌套类
通过“.”调用属性和方法
类的格式
示例
Employee.java
class Employee {
String name;
//属性
int age;
//属性
double salary;
//属性
public String showName(){
System.out.println(name);
return name;
}
public int showAge(){
System.out.println(age);
return age;
}
public void updateName(String name2){
name = name2;
}
public void getSalary(){
System.out.println("The salary of this month is 2000");
}
}
/**
*showName showAge
*updateName getSalary 方法
*/
类的成员
成员变量:
[修饰符] 类型 属性名=[默认值];
其中修饰符有:public、private、protected,也可以省略不写。
例如:
private int id;
private int age=20;
方法:
[修饰符]返回值类型 方法名(形参列表){语句
}
对象的创建和使用 什么是对象
类(class) — 是对某一类事物的描述
对象(object) — 是实际存在的某类事物的个体,
也称为实例(instance)
类是创建对象的模板,对象是类的实例。
文章图片
创建对象
语法格式
类名对象名 = new构造器
示例
Employeezhang = newEmployee( )
示例 TestEmployee.java
构造器(构造方法/构造器,Constructor)
具有与类相同的名称
不含返回值类型
不能在方法中用return语句返回一个值
一般访问权限为public
在一个类中,具有上述特征的方法就是构造器。
构造器的作用
完成对象的创建,即完成对象的实例化
一般使用构造器来完成对成员变量的初始化
示例Employee.java
01public class Person{
02String name;
03int age;
04String sex;
05
06public Person( String n,int a, String s){
07name=n;
08age=a;
09sex=s;
10}
11
12public void sayHello(){
13System.out.println("Hello, my name is "+name);
14}
}
通过实例Person ,可以看到使用带参数的构造器进行实例化简化了代码,在创建对象的同时给对象的属性赋值。此时,类由一个抽象的蓝图变化为一个具体的对象,同时对象的属性已经赋值。通过多次调用构造器,一个类可以实例化出多个对象。
构造器也是方法,但是它是特殊的方法而已。它也可以像普通方法一样发生重载。通常一个类中不止一个构造方法,而是有多个不同参数的构造器,用户可以根据需要选择不同的构造器创建对象。
注意在开发中,我们在编写自己的类时,应该根据需要提供相应的构造器,保证在使用这个类时,能够选择到合适的构造方法。
所有的对象都是通过构造器来创建的,也可以说任何对象都是通过内存分配操作符new 创建和开辟内存空间的。如果在开发时,没有明确的写出构造方法,在编译时编译器会发现该类没有构造器,这时编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,我们称之为“默认的空构造器”。相反,如果我们在编写时,手写了一个或是若干个带参的构造器,那么,这个不带参的空构造器就不会再自动产生并存在。在这样的情况下,如果在某些情况下还想使用这样的无参数默认构造器的话,最好还是养成手写出这个无参数的构造器来,以备后用。否则在这个类中,将不再存在这个默认的构造器。
文章图片
默认的构造器
在Java中,每个类都至少要有一个构造器,如果程序员没有在类里定义构造器,系统会自动为这个类产生一个默认的访问权限为public且参数列表为空的构造器
class Employee{
……}class Employee{
……
publicEmployee( )
{}
……
}
一旦编程者为该类定义了构造器,系统就不再提供默认的构造器
? 练习
下列关于类的定义的选项中,哪些可以通过new Thing()方法来创建该类的一个对象____?
A. public class Thing {}
B. public class Thing {public Thing() {}}
C. public class Thing {public Thing(void) {}}
D. public class Thing {public Thing(String s) {}}
E. public class Thing {public void Thing() {} public Thing(String s) {}}
答案:A、B
对象创建的内存模型
在java中所有的变量、数组、对象都是分配在内存中的,根据变量类型的不同分配的内存也有所不同。Java中主要有3种类型的变量:
局部变量:定义在方法体中的变量;或是方法的形参。
实例变量:即类的属性,也是全局变量。
静态变量:在类中声明为static 的属性。
内存的类别
栈stack:栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变
量和对象的引用值。
堆heap:堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元
素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字
new的地方必定分配了一个堆内存。
我们在实例化一个对象时,同时操作了栈内存和堆内存。在栈内保存对象的首
地址,即引用;在堆内存中保存了对象的属性。对对象的所有操作只能通过
引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾失
效。
堆和栈分别存储哪些变量?
除了8种基本数据类型的变量,其他变量都是引用类型变量
类(class)
Personp ;
接口(interface)
Animal a ;
数组
int[ ] c ;
对象创建的内存模型
Personp=newPerson( “lisi”, 44, “male”);
示例 Person.java PersonTest.java
文章图片
内存结构参考java虚拟机视频
Personp=newPerson( “zhang”, 33,”male”);
Personq=newPerson( “lisi”, 44, “male”);
文章图片
如上所示,对象的属性name 、age、sex都分配在堆内存中,但是对象名 p、q都分配在栈内存中。p 、q也称为对象的引用(reference),引用在java中是地址的同义词。
访问对象:在其他类中或main方法中,若想访问对象的属性或是方法必须先实例化这个类,然后通过对象名(引用)和点操作符来完成:
对象名. 属性名();
对象名. 方法名();
如果在类内的方法中,访问本类的属性和方法就可以直接访问了。
匿名对象
创建完对象,在调用该对象的方法时,也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫匿名对象
Person p1 = new Person();
p1.sayHello();
new Person().sayHello()
示例 Person.java PersonTest.java
使用匿名对象的情况
如果对一个对象只需要进行一次方法调用
垃圾回收机制
Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。
垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。
垃圾回收机制仅仅作用于堆内存,于栈内存无关。
对于程序员来说,对象何时变成垃圾呢?
对象的引用被赋值为null; Person p = new Person( );
p = null;
一次性使用的匿名对象;
new Person( ).sayHello( );
超出生命周期的;如:
for( int I = 0;
i< 100;
i++){
Person p = new Person( );
}
这里,变量p 被实例化100次,每结束一次循环,变量p就超出生命周期,对象变为垃圾。
文章图片
G1垃圾回收器
JDK7中引入了一个新的垃圾回收器,G1,它是Garbage First的缩写。G1回收器优先回收垃圾最多的区域。为了实现这个策略它把堆分成了多个区域,就好比Java 7之前分成三个区域那样(新生代,老生代和持久代)。G1回收器是一个可预测的回收器,同时对那些内存密集型的程序它还能保证较高的吞吐量。
变量的作用域
类变量 用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在
实例变量 类体中声明的成员变量,即非static的属性
局部变量 方法体中声明的变量,方法中的参数,或代码块中声明的变量,都是局部变量
局部变量只在方法调用的过程中有效,方法调用结束后失效
变量的作用域
class Employee {String name;
//实例变量
int age;
//实例变量
double salary;
//实例变量public String showName(){
String hello = “你好”;
//hello为局部变量
System.out.println(hello+name);
return name;
}
public void updateName(String name2){//name2为局部变量
name = name2;
}
}
变量初始化的顺序
隐式赋予变量默认值
成员变量
显式赋予初始值
通过构造器体赋予新值
示例 PersianCat.java
类型缺省值 类型缺省值
byte(byte)0 char'\u0000 '
short(short)0float0.0F
int 0double0.0D
long0L引用对象null
boolean false
各类型变量默认初始化值
this关键字 this关键字
代表对象自身的引用
一个引用
指向调用该方法的当前对象
通常在类的方法定义中使用
用this关键字的情况
方法中的变量与成员变量重名
在一个构造器中,调用其它重载的构造器
返回当前对象的引用
示例 Employee.java Dog.java
本章重点总结 面向对象的思想
类的定义
什么是类
类的属性
对象的创建和使用
创建对象
构造器
this关键字
课后作业
- 定义一个点类Point,包含2个成员变量x、y分别表示x和y坐标,2个构造器Point()和Point(int x0,y0),以及一个movePoint(int dx,int dy)方法实现点的位置移动,创建两个Point对象p1、p2,分别调用movePoint方法后,打印p1和p2的坐标。[必作题]
- 定义一个矩形类Rectangle:(知识点:对象的创建和使用)[必做题]
- 1.定义三个方法:getArea()求面积、getPer()求周长,showAll()分别在控制台输出长、宽、面积、周长。
- 2 有2个属性:长length、宽width
- 3 通过构造方法Rectangle(int width, int length),分别给两个属性赋值
- 4 创建一个Rectangle对象,并输出相关信息
- 定义一个笔记本类,该类有颜色(char)和cpu型号(int)两个属性。 [必做题]
- 1 无参和有参的两个构造方法;有参构造方法可以在创建对象的同时为每个属性赋值;
- 2 输出笔记本信息的方法
- 3 然后编写一个测试类,测试笔记本类的各个方法。
- 设计一个类Student,该类包括姓名、学号和成绩。设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。[选做题]
- 定义两个类,描述如下: [必做题]
- 1定义一个人类Person:
- 1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is XXX”
- 1.2有三个属性:名字、身高、体重
- 2定义一个PersonCreate类:
- 2.1创建两个对象,分别是zhangsan,33岁,1.73;lishi,44,1.74
- 2.2分别调用对象的sayHello()方法。
- 定义两个类,描述如下: [必做题]
- 1定义一个人类Person:
- 1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is XXX”
- 1.2有三个属性:名字、身高、体重
- 1.3通过构造方法,分别给三个属性赋值
- 2定义一个Constructor类:
- 2.1创建两个对象,分别是zhangsan,33岁,1.73;lishi,44,1.74
- 2.2分别调用对象的sayHello()方法。
- 定义一个汽车类Vehicle,要求如下:[选做题]
- 1属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型),并且所有属性为私有。
- 2至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。
- 3为私有属性提供访问器方法。注意:汽车品牌一旦初始化之后不能修改。
- 4定义一个一般方法run(),用打印语句描述汽车奔跑的功能
- 5定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- Python基础|Python基础 - 练习1
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组