2020年秋Java学习第一章数组+第二章类与对象
一数组
数组元素类型:基本数据类型或者引用类型,当数组元素是引用数据类型,new出来的也是引用数据类型
每个数组都有一个成员变量length>=0,数组创建之后length不能改变
1.数组的声明
Type[] arrayname;//Type arrayname[];
注意:声明了数组名不能直接使用,必须经过初始化为其分配内存后才能使用。
2.数组的创建
int[] a;a=new int[8]; 等价于 int[] a=new int[8];
3.数组元素的初始化
int a[]={1,2,3,4,5];
4.数组的引用
引用数组元素:利用数组名和下标确定
注意:元素下标最大值为length-1,一旦下标超过最大值,将会出现数组越界;
二.类与对象的基本概念
面向对象程序的基本组成单位是:类,程序在运行时生成对象,对象之间传递信息;主要概念:抽象、封装、继承、多态
通过封装规定了如何使用对象的数据,控制用户对类的修改和数据访问权限,多数情况下会禁止直接访问对象的数据,只能通过接口访问对象;
Java语言仅支持单继承;
多态是指一个程序中同名的不同方法共存的情况,主要通过子类对父类的覆盖实现的
1.类与对象
类是具有相同操作功能和相同数据格式(属性)的对象的集合和抽象
(1)类的声明
类的语法说明:
[public][abstract|final] class arrayname [<Type{,Type>} [extends 父类名称】
[implements 接口名称列表]
{
变量成员声明以及初始化;
方法声明及方法体;
}
说明
a.class是关键字,表明其后声明的是一个类
b.class 前的修饰符可以有多个,用来限定类的使用方式。public为存取控制符,指明此类是公有类,abstract指明该类是抽象类,final说明该类是终结类,不能产生子类;
c.类名应该时候一个合法的标识符,遵从命名规则;
d.extends是关键字,所声明的类是从某一类派生而来的,父类名字应该写在extends后面;
e.implements 是关键字。所声明的类要实现某些接口,接口名字写在implements后面
public class Clock{ int hour; int minute; int second;//成员变量 } //成员方法 public void setTime(int newH,int news) { hour-newH; minute=newM; second=newS; } public void showTime() { System.out.printIn(hour+":"+nimute+":"+second); }
(2)对象的声明与引用
类X的一个对象就成为类X的一个实例。一个实例是一个类的特定个体
语句:new <classname>();
语句作用:在内存中为此对象分配内存空间,并且返回对象的引用(相当于对象的存储地址)
(3)数据成员
声明成员变量必须给出变量名及其所属类型,同时还可以指定其他特性,声明格式如下:
[public|protected|private] [static][final][transient][volatile] 变量数据类型
变量名=变量初始值;
说明:
a.public,protected、private为访问控制符
b.static指明这是一个静态成员变量;
c.final指明变量的值不能改变
d.transient指明变量是临时变量
e.volatile指明变量是一个共享变量;
(3.1)static的用法:没有static修饰的变量称为实例变量,有static修饰符的变量称为类变量(或者静态变量)
实例变量:用来存储所有实例都需要的属性信息 属性值的得到: 实例名.实例变量名
例如x=new Circle(); //注意:此时如果打印x得到将会是一个地址 x.radius则是属性值
说明:可以将一个类的声明放在一个单独的文件里面,也可以将多个类的声明放在一个文件中(注意:此时最多只能有一个类为公有类,即说明为:public)。
JAVA源文件名必须根据文件中的公有类命名,并且区分大小写。
类变量:属性变量经常用来共享,可以通过为其加上static修饰符使其成为静态变量(类变量)
例如:在Circle类中: static double PI=3.1415926;注意:类变量的值存储在类里面,实例属性的值存储在实例中
类变量的值:类名|实例名.类变量名 //注意:类变量在整个类中只有一个值
4.方法成员:通过方法成员定义类的行为
声明格式:
[public|protected|private][static][final][abstract][native][synchronized]
[<type{,type}>] 返回类型 方法名([参数列表])[throws exceptionList]
{
方法体
}
说明:
(1)public 、proteced、private为访问控制符;static指明方法是一个类方法;final指明方法是一个终结方法;abstract指明方法是一个抽象方法;native用来将java代码和其他语言的代码集合在一起;sysnchronzied用来控制多个并发线程对共享数据的访问。
(2)参数的类型可以是简单数据类型,也可以是引用数据类型//当参数类型为基本数据类型时,采用值传递方式;当参数类型时对象类型或数组类型,采用引用传递方式
(3)方法体是对方法的实现。
(4)throws exceptopnList用来处理异常
使用过程:对象名.方法名([参数列表})
方法成员分类:实例方法以及类方法(静态方法)
实例方法:表示特定对象的方法,在声明前不加static修饰符
(6).类的访问控制
(6.1)类的访问控制只有public(公共类)和无修饰符(默认类)两种;当使用public修饰符时,所有其他的类都可以使用此类;当没有修饰符的时候,则只有于此类处于同一包中的其他类可以使用此类。
(7).类成员的访问控制
类成员的访问控制符有:public、private、protected和无修饰符
public:表示公有,可以被其他任何成员访问(前提是对类成员所在的类有访问权限)
private:类中限定为private的成员只能被这个类本身访问,在类外不可访问
protected:只可以被同一类以及子类的实例对象所访问
无修饰符(默认的):可以被所在包中的各类访问
注意:当在一个类中声明的变量为private,如果要允许其他类访问,则要声明相应的公有方法:例如set和get方法
get方法:格式
public:<fieldType>get <fieldname>()
{
return <fieldName>;
}
例:
public int getRadius()
{
return radius;
}
set方法:格式
public void set <fieldname> (<filedType><paraname>)
{
<fieldbame>=<paramname>;
}
例:public void setRadius(int r)
{
radius=r;
}
关键词this的使用:
如果形式参数名与实例变量名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量名当成形式参数;
例:public void setRadius(int radius)
{
this.radius=radius;
}
3.对象初始化和回收
系统在生成对象时,会为对象分配内存空间,并且自动调用构造方法对实例变量进行初始化,当对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收;
(1)构造方法:用来初始化该类的一个新的对象。构造方法与类名有相同的名称,而且不返回任何数据类型
特点:构造方法的方法名与类名相同;
构造方法没有返回类型(修饰符void也不行)
构造方法可以被声明为共有的(public)
构造方法可以有任意多个参数
主要工作是完成对象的初始化
构造方法不能在程序中显式地调用
在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化
(1.1)系统默认的构造方法:
如果在类声明中没有声明构造方法,Java编译器会提供一个默认的构造方法:没有参数,方法体为空。使用默认的构造方法初始化对象时,如果在声明中没有给实例变量赋初值,则对象的属性值为0或者空;
1 class BankAccount 2 { 3 String ownerName; 4 int accountName; 5 float balance; 6 7 } 8 public class BankTester 9 { 10 public static void main(String srgs[]) 11 { 12 BankAccount myAccout=new BankAcount(); 13 System.out.printIn("ownerName="+myAccount.ownerName); 14 System.out.printIn("accountName="+myAccount.accountName); 15 System.out.printIn("balance="+myAccount.balance); 16 17 } 18 19 20 }
(1.2)自定义构造方法与方法重载
1 public BankAccount(String initName,int initAcoountNumber,float initbalance) 2 { 3 4 ownerName=initName; 5 accountNumber=initAccountNumber; 6 balance=0.0f; 7 } 8 #注意:自定义参数个数<=总的参数个数
(1.3)自定义无参的构造方法
用户在进行类声明中,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法,但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不会再赋默认的构造函数;
在声明构造方法时,好的声明习惯是:或者不声明构造方法,如果声明构造方法,则至少声明两个构造方法,其中一个为无参构造方法;
举例
1 #无参的构造方法 2 3 public BankAccount() 4 { 5 ownerName=""; 6 accountName=999999; 7 balance=0.0f; 8 }
(1.4)this关键字的使用(少参的构造函数调用多参的构造函数)
使用this关键字在一个构造方法中调用另外的构造方法
public BankAccount() { this(" ",99999,0.0f); } public BankAccount(String initName,int initAccountNumber) { this(initName,initAccount,0,0f); } public BankAccount(String initName,int initAccountNumber,float initBalance) { ownerName=initName; accountNumber=initAccountNumber; balance=initBlance; }
(2)内存回收技术
Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存。当一个对象在程序中不再被使用时,即当前的代码段不属于对象的作用域或者把对象的引用赋值为空,则该对象就成为一个无用对象。
Java的垃圾收集器自动扫描对象的动态内存区,对不再使用的对象做上标记进行垃圾回收。
Java的垃圾收集器作为一个线程运行,当系统的内存用尽或者在程序中调用System.gc()要求进行垃圾回收是,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。
Java的每一个类都有一个finalize方法()用于释放资源。如果一个类需要释放除了内存以外的资源,则需要在类中重写finalize()方法。