类的实例就是对象
封装性:
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
概念:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护。
封装作用:
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
继承:
多态:
引用多态是指:父类引用可以指向本类对象,也可指向子类对象。引用多态的强大主要体现在调用属性、方法时,可以根据引用具体指向的对象去调用,例如:子类中重写了父类方法。
方法多态:子类中可以重写父类的方法,在调用方法时根据引用指向的子类对象决定调用哪个具体的方法。方法多态的强大主要体现在可以根据调用时参数的不同,而自主匹配调用的方法,例如:重载。
类使用class来声明:class 类名{类体};
类名最好用字母且首字母大写,类体含变量的声明(体现对象属性的值)和方法的定义(对类声明的变量进行操作,即给出算法,体现对象具有的行为)
成员变量的类型可以为任何数据类型,在整个类中都有效,于其声明位置无关,最好一行声明一个成员变量,利于添加注释。
方法包含方法头{方法体},方法可以返回任意类型,void表示不返回数据。
方法中的变量称为局部变量,局部变量只在方法中有效,且与其声明位置有关,若局部变量与成员变量名字相同,则成员变量被隐藏,该成员变量在方法内暂时失效。局部变量没有默认值,成员变量有默认值
注意:对成员变量的操作只能在方法中进行。
**构造方法:**一种特殊的方法,当程序用类创建实例对象时需要使用它的构造方法。构造方法没有类型,且与它所在的类的名字完全相同。允许在一个类中编写若干构造方法,但必须保证它们的参数不同(个数或者某个参数类型)。若未编写构造方法,系统会默认该类只有一个构造方法(无参无语句)。
对象创建:
使用类的名字进行对象的声明:类名 对象名;
使用new运算符和类的构造方法为声明的对象分配变量,即创建对象,若提供的构造方法有参数,则new创建对象时必须含参数。只声明对象,则分配的内存中没有得到实体,不能使用,必须再进行为对象分配变量的操作。
new运算符赋值机制:
new运算符的运算结果是一个十六进制的数,这个数被称为对象的引用,引用前会给对象中的成员变量分配内存空间,计算出应用后才会给成员变量赋值。对象的引用存在栈中,对象的实体(分配给对象的变量)存在堆中。栈存取速度快,生存周期和数据大小确定,堆动态分配,无确定生存周期,java垃圾收集器自动收走不再使用的数据,存取速度慢,因为要再运行时动态分配。
new运算符和构造方法进行运算时要做两件事:
对象的使用:
对象.变量/方法 :调用属性和方法
一个类声明的两个对象若有相同的引用,二者就拥有完全相同的变量,但一个类创建两个对象后二者引用不同。若object1、object2属于同一个类,当object1=object2;object1和object2的引用完全相同。
垃圾收集机制:当发生object1=object2;时,系统会默认回收object1的变量,此时object1和object2再系统看来是一个名字一个变量。
类与程序基本结构:
一个java应用程序由若干个类构成,可以在一个源文件,也可以在多个源文件中。
java应用程序有一个主类(含main方法的类)java程序从main方法开始执行。
只编译主类的源文件时,java系统会自动地先编译主类需要的其他源文件。提倡一个java源文件只编写一个类。
javac *.java表示编译该目录下全部java源文件。
**传值机制:**参数属于局部变量,方法中的参数变量的值是调用者指定的值的拷贝,方法改变参数的值,不会影响向其传值变量的值。
**基本数据类型参数的传值:**对于基本数据类型的参数,向该参数传值的级别不能高于该参数的级别。
**引用类型参数的传值:**引用型数据(数组,对象,接口)的传值,传递的是变量中存放的引用,而不是变量所引用的实体。(传递引用型变量会改变“原件”)
**可变参数:**声明方法时不给出某项开始直到最后一项参数的名字和个数,但这些参数的类型必须相同:
void f(int … x):x是可变中的参数代表,参数代表必须是参数列表的最后一个。
类中包含某个对象,创建该类的对象时,该对象就会有其它对象
“黑盒复用”:如果a组合了对象b,则a可以委托b调用b的方法,对象和所包含的对象属于弱耦合关系(可以随时更换组合)
对于同一个类的两个对象,如果二者有同样的引用,就会用同样的实体,因此改变其中一个对象的实体,就会导致另一个对象的实体发生同样的变化。
变量
成员变量分为实例变量(无static的成员变量)和类变量(static修饰)。
不同对象的实例变量不同,所有类共享类变量,通过类名可直接访问类变量。
类变量在类加载到内存时就分配了相应的内存空间,该类创建对象时,不同对象的实例变量分配的内存不同,但类变量共用。
方法
类中的方法也分为实例方法和类方法,区别是有无static修饰。类方法有static修饰,也称为静态方法。
当类的字节码文件加载到内存时,未创建对象时类的实例方法不会分配入口地址,但类方法就已经分配了入口地址。对于static方法,不必创建对象就可以用类名直接调用它。
7、方法的重载
重载:方法名相同(修饰符无关),向方法传递的参数不同(参数数量或者数据类型任意一项不同)。
8、this关键字
this出现在类的构造方法中,代表使用该构造方法所创建的对象。实例方法只能通过对象来调用,当this关键字出现在实例方法中时,this就代表正在调用该方法的当前对象。
当实例变量在实例方法中出现时,默认格式:this.成员变量;当static成员变量在实例方法中出现时,默认格式:类名.成员变量;通常可以省略.前面的this或者类名。但是当实例成员变量和局部变量的名字相同时,就需要加this或者类名。
9、包
包名的目的是区分名字相同的类。package sum.com
有源文件保存在C:\1000\tom\jiafei中
我们要到包(jiafei)的上一层目录(可以理解为包的文件夹的上一层,1000)去进行文件的编译和运行,java语言不允许使用java作为包名的第一部分。
C:\1000> javac tom\jiafei\源文件
C:\1000> java tom.jiafei.主类名
10、import语句
import java.util.*; //表示引用util包中的所有类
//java.lang包是java语言的核心库类,它包含运行java程序必不可少的系统类,系统自动引入lang包(含System、Math类)
//引入整个包只会增加编译时间,不会影响性能,因为只有被使用到的类才会编译成字节码文件加载到内存中
11、访问权限
public、protected、友好的、private ——从高到低的权限等级
public:修饰的变量或方法称为共有变量或共有方法。可以在另外一个类中通过类名来调用共有变量或共有方法。
protected:修饰的变量或方法称为受保护变量或受保护方法。同一个包中的类可以通过另一类名调用其受保护的方法或变量
private:修饰的变量或方法称为私有变量或私有方法,一个类中的私有变量不能再另外一个类中通过类名来操作这个私有变量或私有方法,提倡将变量设置为私有,通过方法来调用。
无修饰符:友好变量或者友好方法,在同一个包中可以通过类名在另外一个类中调用友好方法或者友好变量,若通过导入调用的类的对象,该对象不能调用自己的友好变量和友好方法。
public与友好类:另一个类中使用友好类创建对象时要保证它们在同一个包中,不能用protected和private修饰类。
12、JRE与JAR文件
将类打包成jar文件放入扩展(jre\lib\ext)中,可以用jar.exe命令,将类的字节码文件压缩为一个jar文件。
1、Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中,其中必须有一个源文件含有主类。
2、局部变量没有默认值。
3、Hello无法通过编译,因为其中的hello方法的方法头是错误的(没有类型)。成员方法的方法头不能没有类型
4、不能用protected和private修饰类
5、类体中成员变量的声明和方法的定义可以交叉进行。
6、成员变量在整个类内都有效,其有效性与它在类体中书写的先后位置无关。
7、用new运算符和构造方法创建对象的正确步骤:
1.为成员变量分配内存,并指定默认值。
2.初始化成员变量,即用户声明成员变量时给定的默认值。
3.执行构造方法。
4.计算出一个引用值。
8、构造方法没有类型:含有类型的方法不是构造方法。
9、方法中声明的局部变量不可以用static修饰。
10、类中的类方法(static方法)只能操作类变量(static变量),不可以操作实例变量,但实例方法可以操作类变量。
11、如果在类中显示地定义了构造方法,Java编译器将不再提供默认的构造方法。
12、编译器不提示程序使用了空对象(让一个空对象去调用实例方法),但程序在运行时会出现NullPointerException异常。
13、类中的类变量(static)在该类被加载到内存时(即使该类未创建对象)就会被分配内存空间。
14、当this关键字出现在实例方法中时,就代表正在调用该方法的当前对象。
15、一个类声明的两个对象如果具有相同的引用,二者就具有完全相同的变量(实体)。
16、用户定义构造方法的访问权限可以是public,protected,private或友好的。
17、当方法被调用时,参数被分配内存空间,调用者向参数传递值,即方法被调用时,参数变量必须有具体的值。
18、类所声明的变量被称为对象,对象(变量)负责存放引用,以确保对象可以操作分配给该对象的变量以及调用类中的方法。分配给对象的变量被习惯地称做对象的实体。
用该方法的当前对象。
15、一个类声明的两个对象如果具有相同的引用,二者就具有完全相同的变量(实体)。
16、用户定义构造方法的访问权限可以是public,protected,private或友好的。
17、当方法被调用时,参数被分配内存空间,调用者向参数传递值,即方法被调用时,参数变量必须有具体的值。
18、类所声明的变量被称为对象,对象(变量)负责存放引用,以确保对象可以操作分配给该对象的变量以及调用类中的方法。分配给对象的变量被习惯地称做对象的实体。
19、this不可以出现在类方法(static方法)中。
20、只有初始化后的变量才能参与运算。