Java编程详解大全.docx
《Java编程详解大全.docx》由会员分享,可在线阅读,更多相关《Java编程详解大全.docx(175页珍藏版)》请在冰豆网上搜索。
![Java编程详解大全.docx](https://file1.bdocx.com/fileroot1/2022-12/16/4e602275-9675-4f0c-b96e-60e6e2d953c2/4e602275-9675-4f0c-b96e-60e6e2d953c21.gif)
Java编程详解大全
纲要
面向过程与面向对象的区别。
面向对象的三大特性
类与对象的概念
类的定义
对象的创建和使用
Java中的封装特性
构造函数
对象内存分析及引用传递
this关键字
static关键字
单例模式初步
类的继承
方法的覆盖
super关键字
final关键字
抽象类
接口
多态
抽象类与接口的区别
Object类
package和import
访问权限控制
内容
1.1、面向过程与面向对象的区别(盖饭、蛋炒饭)
为什么会出现面向对象分析方法?
因为现实世界太复杂多变,面向过程的分析方法无法满足
面向过程?
采用面向过程必须了解整个过程,每个步骤都有因果关系,每个因果关系都构成了一个步骤,多个步骤就构成了一个系统,因为存在因果关系每个步骤很难分离,非常紧密,当任何一步骤出现问题,将会影响到所有的系统。
如:
采用面向过程生产电脑,那么他不会分CPU、主板和硬盘,它会按照电脑的工作流程一次成型。
面向对象?
面向对象对会将现实世界分割成不同的单元(对象),实现各个对象,如果完成某个功能,只需要将各个对象协作起来就可以。
1.2、面向对象的三大特性
●封装
●继承
●多态
1.3、类与对象的概念
类是对具有共性事物的抽象描述,是在概念上的一个定义,那么如何发现类呢?
通常根据名词(概念)来发现类,如在成绩管理系统中:
学生、班级、课程、成绩
学生—张三
班级—602
课程—J2SE
成绩—张三成绩
以上“张三”、“602”、“J2SE”和“张三的成绩”他们是具体存在的,称为对象,也叫实例
也就是说一个类的具体化,就是对象或实例
为什么面向对象成为主流技术,主要就是因为更符合人的思维模式,更容易的分析现实世界,所以在程序设计中也采用了面向对象的技术,从软件的开发的生命周期来看,基于面向对象可以分为三个阶段:
●OOA(面向对象的分析)
●OOD(面向对象的设计)
●OOP(面向对象的编程)-----Java就是一个纯面向对象的语言
我们再进一步的展开,首先看看学生:
学生:
学号、姓名、性别、地址,班级
班级:
班级代码、班级名称
课程:
课程代码、课程名称
成绩:
学生、课程、成绩
大家看到以上我们分析出来的都是类的属性
接下来采用简易的图形来描述一下,来描述我们的概念(来源成绩管理系统的概念,来源于领域的概念,这个领域就是成绩系统管理领域)
以上描述的是类的属性,也就是状态信息,接下来,再做进一步的细化
通过以上分析,大家应该了解:
类=属性+方法
属性来源于类的状态,而方法来源于动作
以上模型完全可以使用面向对象的语言,如Java来实现
1.4、类的定义
在Java中如何定义类?
具体格式:
类的修饰符class类名extends父对象名称implements接口名称{
类体:
属性和方法组成
}
【示例代码】
publicclassStudent{
//学号
intid;
//姓名
Stringname;
//性别
booleansex;
//地址
Stringaddress;
//年龄
intage;
}
以上属性称为成员变量,局部变量是在方法中定义的变量,方法的参数,方法的返回值,局部变量使用前必须初始化,而成员变量会默认初始化,初始化的值名为该类型的默认值
1.5、对象的创建和使用
必须使用new创建出来,才能用。
【示例代码】
publicclassOOTest01{
publicstaticvoidmain(String[]args){
//创建一个对象
Studentzhangsan=newStudent();
System.out.println("id="+zhangsan.id);
System.out.println("name="+zhangsan.name);
System.out.println("sex="+zhangsan.sex);
System.out.println("address="+zhangsan.address);
System.out.println("age="+zhangsan.age);
}
}
classStudent{
//学号
intid;
//姓名
Stringname;
//性别
booleansex;
//地址
Stringaddress;
//年龄
intage;
}
具体默认值如下:
类型
默认值
byte
0
short
0
int
0
long
0L
char
‘\u0000’
float
0.0f
double
0.0d
boolean
false
引用类型
null
对成员变量进行赋值
publicclassOOTest02{
publicstaticvoidmain(String[]args){
//创建一个对象
Studentzhangsan=newStudent();
zhangsan.id=1001;
zhangsan.name="张三";
zhangsan.sex=true;
zhangsan.address="北京";
zhangsan.age=20;
System.out.println("id="+zhangsan.id);
System.out.println("name="+zhangsan.name);
System.out.println("sex="+zhangsan.sex);
System.out.println("address="+zhangsan.address);
System.out.println("age="+zhangsan.age);
}
}
classStudent{
//学号
intid;
//姓名
Stringname;
//性别
booleansex;
//地址
Stringaddress;
//年龄
intage;
}
一个类可以创建N个对象,成员变量只属于当前的对象(只属于对象,不属于类),只有通过对象才可以访问成员变量,通过类不能直接访问成员变量
以上程序存在缺点,年龄可以赋值为负数,怎么控制不能赋值为负数?
1.6、面向对象的封装性
控制对年龄的修改,年龄只能为大于等于0并且小于等于120的值
publicclassOOTest03{
publicstaticvoidmain(String[]args){
//创建一个对象
Studentzhangsan=newStudent();
/*
zhangsan.id=1001;
zhangsan.name="张三";
zhangsan.sex=true;
zhangsan.address="北京";
zhangsan.age=20;
*/
zhangsan.setId(1001);
zhangsan.setName("张三");
zhangsan.setSex(true);
zhangsan.setAddress("北京");
zhangsan.setAge(-20);
System.out.println("id="+zhangsan.id);
System.out.println("name="+zhangsan.name);
System.out.println("sex="+zhangsan.sex);
System.out.println("address="+zhangsan.address);
System.out.println("age="+zhangsan.age);
}
}
classStudent{
//学号
intid;
//姓名
Stringname;
//性别
booleansex;
//地址
Stringaddress;
//年龄
intage;
//设置学号
publicvoidsetId(intstudentId){
id=studentId;
}
//读取学号
publicintgetId(){
returnid;
}
publicvoidsetName(StringstudentName){
name=studentName;
}
publicStringgetName(){
returnname;
}
publicvoidsetSex(booleanstudentSex){
sex=studentSex;
}
publicbooleangetSex(){
returnsex;
}
publicvoidsetAddress(StringstudentAddress){
address=studentAddress;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAge(intstudentAge){
if(studentAge>=0&&studentAge<=120){
age=studentAge;
}
}
publicintgetAge(){
returnage;
}
}
从上面的示例,采用方法可以控制赋值的过程,加入了对年龄的检查,避免了直接操纵student属性,这就是封装,封装其实就是封装属性,让外界知道这个类的状态越少越好。
以上仍然不完善,采用属性仍然可以赋值,如果屏蔽掉属性的赋值,只采用方法赋值,如下:
publicclassOOTest04{
publicstaticvoidmain(String[]args){
//创建一个对象
Studentzhangsan=newStudent();
zhangsan.id=1001;
zhangsan.name="张三";
zhangsan.sex=true;
zhangsan.address="北京";
zhangsan.age=20;
/*
zhangsan.setId(1001);
zhangsan.setName("张三");
zhangsan.setSex(true);
zhangsan.setAddress("北京");
zhangsan.setAge(20);
*/
/*
System.out.println("id="+zhangsan.id);
System.out.println("name="+zhangsan.name);
System.out.println("sex="+zhangsan.sex);
System.out.println("address="+zhangsan.address);
System.out.println("age="+zhangsan.age);
*/
System.out.println("id="+zhangsan.getId());
System.out.println("name="+zhangsan.getName());
System.out.println("sex="+zhangsan.getSex());
System.out.println("address="+zhangsan.getAddress());
System.out.println("age="+zhangsan.getAge());
}
}
classStudent{
//学号
privateintid;
//姓名
privateStringname;
//性别
privatebooleansex;
//地址
privateStringaddress;
//年龄
privateintage;
//设置学号
publicvoidsetId(intstudentId){
id=studentId;
}
//读取学号
publicintgetId(){
returnid;
}
publicvoidsetName(StringstudentName){
name=studentName;
}
publicStringgetName(){
returnname;
}
publicvoidsetSex(booleanstudentSex){
sex=studentSex;
}
publicbooleangetSex(){
returnsex;
}
publicvoidsetAddress(StringstudentAddress){
address=studentAddress;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAge(intstudentAge){
if(studentAge>=0&&studentAge<=120){
age=studentAge;
}
}
publicintgetAge(){
returnage;
}
}
以上采用private来声明成员变量,那么此时的成员变量只属于Student,外界无法访问,这样就封装了我们的属性,那么属性只能通过方法访问,通过方法我们就可以控制对内部状态的读取权利。
封装属性,暴露方法(行为)
1.7、构造函数(构造方法,构造器)
构造方法主要用来创建类的实例化对象,可以完成创建实例化对象的初始化工作,声明格式:
构造方法修饰词列表类名(方法参数列表)
构造方法修饰词列表:
public、proteced、private
类的构造方法和普通方法一样可以进行重载
构造方法具有的特点:
●构造方法名称必须与类名一致
●构造方法不具有任何返回值类型,即没有返回值,关键字void也不能加入,加入后就不是构造方法了,就成了普通的方法了
●任何类都有构造方法,如果没有显示的定义,则系统会为该类定义一个默认的构造器,这个构造器不含任何参数,如果显示的定义了构造器,系统就不会创建默认的不含参数的构造器了。
【代码示例】,默认构造方法(也就是无参构造方法)
publicclassConstructorTest01{
publicstaticvoidmain(String[]args){
//创建一个对象
Studentzhangsan=newStudent();
zhangsan.setId(1001);
zhangsan.setName("张三");
zhangsan.setSex(true);
zhangsan.setAddress("北京");
zhangsan.setAge(20);
System.out.println("id="+zhangsan.getId());
System.out.println("name="+zhangsan.getName());
System.out.println("sex="+zhangsan.getSex());
System.out.println("address="+zhangsan.getAddress());
System.out.println("age="+zhangsan.getAge());
}
}
classStudent{
//学号
privateintid;
//姓名
privateStringname;
//性别
privatebooleansex;
//地址
privateStringaddress;
//年龄
privateintage;
//默认构造方法
publicStudent(){
//在创建对象的时候会执行该构造方法
//在创建对象的时候,如果需要做些事情,可以放在构造方法中
System.out.println("----------Student-------------");
}
//设置学号
publicvoidsetId(intstudentId){
id=studentId;
}
//读取学号
publicintgetId(){
returnid;
}
publicvoidsetName(StringstudentName){
name=studentName;
}
publicStringgetName(){
returnname;
}
publicvoidsetSex(booleanstudentSex){
sex=studentSex;
}
publicbooleangetSex(){
returnsex;
}
publicvoidsetAddress(StringstudentAddress){
address=studentAddress;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAge(intstudentAge){
if(studentAge>=0&&studentAge<=120){
age=studentAge;
}
}
publicintgetAge(){
returnage;
}
}
【代码示例】,带参数的构造方法
publicclassConstructorTest02{
publicstaticvoidmain(String[]args){
//调用带参数的构造方法对成员变量进行赋值
Studentzhangsan=newStudent(1001,"张三",true,"北京",20);
System.out.println("id="+zhangsan.getId());
System.out.println("name="+zhangsan.getName());
System.out.println("sex="+zhangsan.getSex());
System.out.println("address="+zhangsan.getAddress());
System.out.println("age="+zhangsan.getAge());
}
}
classStudent{
//学号
privateintid;
//姓名
privateStringname;
//性别
privatebooleansex;
//地址
privateStringaddress;
//年龄
privateintage;
publicStudent(intstudentId,StringstudentName,booleanstudentSex,StringstudentAddress,intstudentAge){
id=studentId;
name=studentName;
sex=studentSex;
address=studentAddress;
age=studentAge;
}
//设置学号
publicvoidsetId(intstudentId){
id=studentId;
}
//读取学号
publicintgetId(){
returnid;
}
publicvoidsetName(StringstudentName){
name=studentName;
}
publicStringgetName(){
returnname;
}
publicvoidsetSex(booleanstudentSex){
sex=studentSex;
}
publicbooleangetSex(){
returnsex;
}
publicvoidsetAddress(StringstudentAddress){
address=studentAddress;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAge(intstudentAge){
if(studentAge>=0&&studentAge<=120){
age=studentAge;
}
}
publicintgetAge(){
returnage;
}
}
【代码示例】,进一步理解默认构造方法
publicclassConstructorTest03{
pub