Java学习笔记-3.类与对象
一、面向对象程序设计
1.概念:
OOA:面向对象的分析,将现实世界进行抽象的分析OOD:面向对象的设计
OOP:面向对象的程序
2.面向对象的特点:
(1)封装性:一是把对象的全部状态和行为结合在一起,形成一个不可分割的整体,对象的私有属性只能由对象的行为来修改和读取
二是尽可能隐藏对象的内部细节,与外界的联系只能够通过外部接口来实现
(2)继承性:特殊类的对象拥有其一般类的属性和行为
(3)多态性:指同一个实体同时具有多种形式,体现在不同的对象可以根据相同的消息产生各自不同的动作
二、类
1.类的实现
[访问控制符] [修饰符] class 类名
{ //类体开始标志
[类的成员变量说明] //成员变量定义及初始化
[类的构造方法定义] //构造方法定义
[类的成员方法定义] //成员方法定义
} //类体结束标志
2.成员变量
[访问控制符] [修饰符] 数据类型 成员变量名 [= 初始值];
注:在没有赋值的情况下,Java将给其一个默认初值(final 变量除外)
3.成员方法
[访问控制符] [修饰符] 返回值类型 方法名([形式参数表])
{
[变量声明] //方法内用的变量,局部变量
[程序代码] //方法的主体代码
[return [表达式]] //返回语句
}
三、对象
1.对象的创建和使用
对象创建格式: 类名称 对象名称 = new 类名称(参数值列表);
也可以细分为: 类名称 对象名称 = null; //在栈内存中声明
对象名称 = new 类名称(参数值列表); //在堆空间声明
对象引用属性和调用方法格式:对象名称.成员变量名;
对象名称.成员方法名(实际参数表);
2.Java的内存机制:Java存在两种内存:栈内存、堆内存
基本类型的变量和对象引用都是在栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当变量所在代码块运行结束,Java会自动释放掉为该变量分配的空间
堆内存用来存放由new创建的对象,在堆中分配的内存,由Java虚拟机的自动垃圾回收器管理
实质:在栈内存中创建对象引用,在堆内存中创建对象本身
例:Person xiaoming2 = null;
xiaoming2 = xiaoming; //对象本身并没有复制,被复制的只是对象引用
3.与C++的区别:Object o2 = o1;
在Java中只是把对象o1的引用复制给了o2,它们指向同一个对象,即只有一个对象
在C++中将一个名为o1的对象的数据复制给o2,即存在两个对象,它们的值相同
四、方法
1.方法参数传递:Java只有一种参数传递方式,即按值传递
如果实参是基本类型的数据,形参得到的是基本类型数据的一份拷贝
如果实参是对象或者数组时,形参得到的是对象引用的拷贝,即实参和形参指向同一对象
2.方法的重载:在一个类中两个或更多的方法拥有相同的方法名,但是参数列表各不同
编译器会根据实参列表数中参数数目及类型来决定调用哪个方法
注:返回值类型不能用于区分方法
一般建议,同一组重载方法应当具有相似的功能,这样能增强程序的可读性,便于程序的维护
3.构造方法:在创建对象时被调用
特征:具有与类相同的名称,方法声明中未定义返回值类型,没用return返回值
如果没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法
注:构造方法也可以被重载
4.局部变量:Java中没有为局部变量提供默认值,作用域:声明开始到包含它的块尾
在Java中,不能在嵌套的两个块中声明同名变量,但在互不嵌套的不同块中可以多次声明同名变量
五、关键字this
1.this:当前对象
当方法内的局部变量和类的成员变量同名时,成员变量就会被隐藏,这时如果想在成员方法中使用成员变量,则必须使用关键字this
2.如果某个构造函数的第一条语句具有形式this(…),那么这个构造函数将调用本类的其他构造函数
例:
ThisDemo(String s) {
System.out.println(“constructor s = ” + s);
}
ThisDemo(int i, String s) {
this(s);
this.i = i;
}
注:通过this调用构造函数,必须为当前构造函数的第一行,且构造方法只能调用一个构造函数
六、关键字static
1.关键字static可以用来修饰类的成员和成员方法。
如果将关键字static放在一个成员变量声明前,该变量就成为静态变量,也成为类的成员变量
如果将关键字static放在一个成员方法定义前,该变量就成为静态方法,也成为类的成员方法
2.静态变量(方法)可以直接通过类名访问(不提倡通过相应对象访问),且调用不需先实例化
3.静态方法没有相应的this引用
静态方法中不能直接访问所属类的非静态变量和非静态方法
非静态方法可以直接访问所属类的静态变量和静态方法
七、包
1.package的声明格式:package 包名;
当包中还有子包时,可以使用“包1.包2…包n”进行指定
包名可以理解为一个目录名
2.package的导入格式:import 包名.类名称
注:此类必须声明成public
引用一个包中的全部类:可用”*”表示,例:import test.demo.*
八、访问控制
1.类成员的访问控制符
控制等级 同一个类中 同一个包中 不同包中的子类 任意类 private √ default √ √ protected √ √ √ public √ √ √ √ 2.类的访问控制符
控制等级 同一个包中 不同包中 default √ public √ √