这里是学习java的第二课,虽然距离第二节课已经过去近一周了,但是笔记不能忘记
面向对象编程【 Object Oriented Programming】
C语言:面向过程编程 【Procedure Oriented Programming】
对象:功能的集合体
过程:函数,指代“功能”
这两种编程实现,来源于我们从什么角度看待软件
软件是功能的集合体 --面向过程
软件是对象的集合体,对象中包含功能--面向对象
- 例子:银行系统里面,用户的账号,密码,姓名,余额是基本信息,如果有很多顾客需要存储这些信息,如何定义变量呢?
- -将账号,密码,姓名,余额打包定义为一个“顾客”类型,编程时,定义“顾客”,以后使用“顾客”类型
- 顾客就是一个个对象;打包定义实际上是定义“顾客”这个类型
编程角度,面向对象的两个基本概念:
类(class):定义了对象的共同特征
对象(Object):通过类,生成一个个对象
例子:将账号,密码,姓名,余额打包定义为一个“顾客”类(class),编程时,通过“顾客”类,生成一个个对象(Object)
class 类名{
相关变量或者函数
}
int a;
类名 对象名=new 类名();
对象名.变量名
class Customer{
String account;
String password;
String cname;
double balance;
public static void main (String[] args) {
Customer zs = new Customer();
Customer ls;
ls = new Customer();
zs.account = "zhangsan"; zs.balance = 1000;
ls.cname = "李四"; ls.balance = 5897;
System.out.println(zs.balance);
System.out.println(ls.balance);
}
}
概念:
- (1)类和对象的关系:抽象和具体
- (2)类生成对象:又叫做:实例化对象;对象也被称为类的实例(instance)
- (3)类里面的变量,又叫做成员变量,保存的是该类所有对象的基本信息(也叫做属性,或者叫做“域(Field)”)
- (4)类中除了有属性以外,还可以定义功能,功能用函数表示;函数叫做成员函数,又叫做:方法(Method)
总结:类包含成员变量和成员函数,两者统称“成员”(Member)
Customer zs = new Customer();
zs的性质类似于C语言里面的指针,Java中叫做对象的引用名称,又叫做引用(reference)
zs.account
扩充内容:对象数组,一次性定义很多对象,以数组形式保存
定义100个Customer对象, 每个对象初始值1000元。
int[] a = new int[100];
Customer[] a = new Customer[100];
通过循环,给每个元素逐个分配对象内存
实现功能的复用
(1)无参数无返回类型的函数
void 函数名称(){
//函数体
}
(a).void不能省略
(b).可以通过return;语句跳出函数
(2)有参数无返回类型的函数
void 函数名称(参数定义列表,用逗号隔开){
//函数体
}
(a).参数不能给默认值
(b).函数中定义的参数叫形参;实际调用时传入的参数叫实参
(3)有参数有返回类型的函数
(a).原则上,定义的返回类型和实际返回值类型一致
class Customer{
String account;
String password;
String cname;
double balance = 0;
void cunKuan(double money){
balance += money;
System.out.println("存款成功,余额为:" + balance);
}
public static void main (String[] args) {
Customer zs = new Customer();
zs.cunKuan(200);
zs.cunKuan(5000);
System.out.println(zs.balance);
}
}
class Test{
void swap(int a, int b){
int t; t = a; a = b; b = t;
}
}
class Customer{
String account;
int balance;
public static void main (String[] args) {
Customer zs = new Customer(); zs.balance = 1000;
Customer ls = new Customer(); ls.balance = 2000;
Test t = new Test(); t.swap(zs.balance,ls.balance);
System.out.println(zs.balance);
}
}
1、值传递:简单数据类型
2、引用传递:数组、对象
class Customer{
String account;
double balance;
void init(String a,double b){
account = a;
balance = b;
}
public static void main (String[] args) {
Customer zs = new Customer();
zs.init("zhangsan",1000);
System.out.println(zs.account);
}
}
问题:Java中能否定义多个同名的函数?
答案:可以
但是要满足以下条件之一:
- 1、参数个数不同
- 2、参数个数相同,类型不同
- 3、参数个数类型相同,出现顺序不同
注意:以下两种不能成为函数同名的条件- a、返回类型不同
- b、参数名称不同
以上功能叫做:重载(overload)
重载:定义多个形参不同的函数,函数名相同;根据实参类型,自动匹配相应的函数,进行调用
重载:一个函数名称,在不同实参情况下,完成不同的功能
1、构造函数的作用:
对对象进行初始化
2、如何定义?
1)构造函数名称和类名相同
2)构造函数没有返回类型
3)可以定义多个构造函数(重载)
4)构造函数在实例化对象时传入参数
3、构造函数的性质?
1)构造函数在实例化对象时,自动调用1次
2)构造函数在对象生命周期中,只会自动调用1次,不可手动调用
3)如果类没有定义构造函数,系统自动给其一个空的不带参数的构造函数,如果定义了构造函数,该默认构造函数失效
思考:构造函数在对象生命周期中,只会自动调用1次,不可手动调用;如果对象在生命周期中要再次做初始化呢?
- 方法:将初始化工作写在初始化函数;构造函数调用初始化函数
class Customer{
String account;
double balance;
Customer(String a,double b){
init(a,b);
}
void init(String a,double b){
account = a;
balance = b;
}
public static void main (String[] args) {
Customer zs = new Customer("zhangsan",1000);
System.out.println(zs.account);
//...
//初始化
zs.init("zhangsan",1000);
}
}
this.变量名/函数名 特别标记该变量或函数为类中的成员
4、对象何时消亡?
对象成为内存垃圾之后(无任何引用指向该对象),垃圾搜集机制会根据系统情况,自动进行垃圾搜集,此时对象消亡
5、可否手动垃圾搜集?
System.gc(); 不建议经常手动垃圾搜集
class Customer{
String account;
double balance;
Customer(String account,double balance){
this.account = account;
this.balance = balance;
}
protected void finalize(){
System.out.println("TEST");
}
public static void main (String[] args) {
Customer zs = new Customer("zhangsan",1000);
zs = new Customer("zs",2000);
//System.gc();
}
}
6、对象消亡时,可以通过finalize函数完成一些工作,该函数由系统自动运行,格式如下:
protected void finalize(){ /*函数体*/ }
该函数根据情况编写。如果在对象消亡时,要执行一些除了内存释放之外的其他工作,可以编写该函数完成