本章着重介绍Java编程中类和对象等非常重要的概念。
Java程序是由类组成的,编写Java程序的过程就是从现实世界中抽象出Java可实现的类并用合适的语句定义它们的过程,这个定义过程包括对类内各种属性和方法的定义,创建类的对象,也包括类间的各种关系和接口的定义。
4.1 类及方法
二、类的声明
2.类头
class关键字表明一个类的开始,在它的后面,应跟随新数据类型的名称。(注意不要把class写成Class)。
类名最好采用见名知意的原则,如果类名是一个单词,首字母最好用大写字母,若由几个单词复合而成,每个单词的首字母最好都用大写字母。如:BeiJingTime, HelloChina等。
父类名跟在extends 关键字后面,用来说明当前类是哪个已经存在类的子类,存在继承关系。继承是类与类之间的一种非常重要的关系。
例1
abstract class A
{ abstract void callMe();
void callMeToo()
{ System.out.println("this is a concrete methods.");
}
}
class B extends A
{ void callMe()
{ System.out.println("B's implementation of callme.");
}
}
class AbstractDemo
{ public static void main(String args[])
{ B b;
b=new B();
b.callMe();
b.callMeToo();
}
}
三、类体
2.方法
用来描述类的功能,类中定义的方法(又称成员函数)通常起到两种作用:
- 一是围绕着类的属性进行各种操作;
- 二是与其他的类或对象进行数据交流、消息传递等操作。
方法头一般由方法名、参数列表、返回类型、方法修饰符和方法抛出的例外五部分组成。
- (1)方法名可以是任何有效的标识符,命名规则与标识符命名规则相同。 方法名由一个单词组成时,首字母用小写。 方法名由多个单词组成时,从第2个单词开始其它单词的首写字母用大写。
- (2)类型说明符用来指定方法返回值的类型,方法最多只能返回一个值。
- (3)参数列表是方法的输入接口,它列出了一系列形式参数的类型和名称,形参类型说明必须在参数表中给出,方法参数表的右括号后加一个分号是语法错误。
- (4)参数表以逗号为分隔符,其中包含了方法被调用时传递给方法的参数说明。对于方法定义中的每一个参数,方法调用时必须有一个参量与之对应,而且该参量的类型必须与对应参数类型相一致。
3.方法的调用
4.构造方法
构造方法是一种特殊的方法,其特殊性主要体现在以下几个方面:
- (1)构造方法的方法名与其所在类的类名相同。
- (2)构造方法的主要作用是完成对类对象的初始化工作。
- (3)构造方法不能由编程人员显式地直接调用。
- (4)构造方法总是和new运算符一起使用。
- (5)在创建一个类的新对象的同时,系统会自动调用该类的构造方法为新对象初始化。
- (6)如果定义类时没有显示的定义构造方法,则系统提供不带参数的默认构造方法,默认构造方法将成员变量初始化为默认值。
- (7)构造方法可以带有参数,但没有返回类型。
- (8)一个类可以有多个构造方法。
class People
{
int change;
float height,weight;
boolean bigear;
String head;
void speak(String s)
{
System.out.println(s);
}
}
class A
{
public static void main(String args[])
{
}
}
4.2 对象
class People
{
int change;
float height,weight;
boolean bigear;
String head;
void speak(String s)
{
System.out.println(s);
}
}
class A
{
public static void main(String args[])
{
}
}
2. 为对象分配内存
class People
{
int change;
float height,weight;
boolean bigear;
String head;
void speak(String s)
{
System.out.println(s);
}
}
class A
{
public static void main(String args[])
{
People zhubajie;
zhubajie=new People();
}
}
3. 对象的内存模型
class People
{
int change;
float height,weight;
boolean bigear;
String head;
void speak(String s)
{
System.out.println(s);
}
}
class A
{
public static void main(String args[])
{
People zhubajie=new People();
People sunwukong=new People();
}
}
二、使用对象
三、对象的引用和实体
- 2-3-java存在“垃圾收集”机制,这种机制周期性地检测某个实体是否已不再被任何对象所拥有,如果出现这样的实体,就释放实体占有的内存。P51注。
- 7-People shasang;
- 如果程序中使用了空对象,程序在运行时会出现异常:NullPointerException。由于对象是动态地分配实体,所以java的编译器对空对象不做检查。
四、参数传值
2.引用类型参数的传值
如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化。
4.3 static和this
一、实例变量和类变量的区别
1.所有对象的类变量都被分配相同的一处内存。
2.不同对象的实例变量将被分配不同的内存空间。
3.类变量不仅可以通过某个对象访问,也可以直接通过类名访问。
4.实例变量可以通过对象访问,不能使用类名访问。
Q1:OK
System.out.println(StaticFun.setA(121));可以写成:
System.out.println(setA(121));
Q2:NO
Q3:OK
Q4:ok
Q5:no
二、实例方法和类方法的区别
1.类的实例方法,只有在该类的对象创建后才分配入口地址。从而该实例方法可以被该类创建的任何对象调用执行。
2.类方法,在该类被加载到内存时,就分配了入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。
3.类方法只能操作类变量,不能操作实例变量,也不能调用实例方法。
4.实例方法既能对类变量进行操作也能对实例变量进行操作。
5.实例方法可以调用该类中的其他方法,类方法只能调用该类中的其他类方法。
三、this
- this关键字可以出现在类的实例方法中,代表使用该类的当前对象。
- this关键字也可以出现在类的构造方法中,代表使用该类所创建的对象。
- this关键字不能出现在类方法中。
【练习1】下列A类的类体中哪些代码是错误的?
【练习2】请说出A类中System.out.println的输出结果?
【练习3】请说出A类中System.out.println的输出结果?
4.4 包
二、包的引入
常见的JAVA API:
- java.lang 提供基本的数据类型及操作,此包由编辑器自动地导入所有程序。
- java.util 提供高级数据类型及操作,如日期和时间操作。
- java.io 提供输入/输出流控制,含有支持输入和输出的类。
- java.awt 提供图形界面控制。
- java.awt.event 提供窗口事件处理,包括剪贴板、字符串发送器等。
- java.net 提供支持Internet协议的功能。利用java.net包,开发者可以编写自己的具有网络功能的程序。
- java.applet 提供实现浏览器环境中Applet的有关类和方法。
- java.sql 提供与数据库连接的接口。
- java.security 提供安全性方面的有关支持。利用其中的类可以对java程序加密,也可以把特定的Java Applet标记为“可信赖”,使它能够具有与Java Application相近的安全权限。
4.5 访问权限
class Tom
{
private float weight;
private float f(float a,float b)
{ ... }
}
class Jerry
{
void g( )
{ Tom cat=new Tom( );
cat.weight=23f; //非法
cat.f(3f,4f); //非法
}
}
将Tom修改为:
class Tom
{
private float weight;
private float f(float a,float b)
{ ... }
void g( )
{ Tom cat=new Tom( );
cat.weight=23f;
cat.f(3f,4f); }
}
二、public
- 用public修饰的变量叫共有变量
- 用public修饰的方法叫共有方法
- 可以用public修饰类,这样的类叫共有类
- 共有类可以被同一个包中的其它类使用,也可以被不在同一个包中的其它类使用
- 共有变量和共有方法,可以被定义在其它类中的对象访问和修改
三、缺省(友好)
- 如果变量和方法前没有修饰符,称这样的变量和方法为友好变量和友好方法
- 如果类的修饰符缺省,这样的类叫友好类
- 友好类可以被同一个包中的其它类使用,但不可以被不在同一个包中的其它类使用
- 友好变量和友好方法,可以被同一个包中的在其它类中定义的对象访问和修改
四、protected
- protected修饰的变量和方法,称为受保护的变量和受保护的方法
- protected不能用来作类的修饰符
- protected修饰的成员,可以被三种类引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类。
本章着重介绍Java编程中类和对象等非常重要的概念。
Java程序是由类组成的,编写Java程序的过程就是从现实世界中抽象出Java可实现的类并用合适的语句定义它们的过程,这个定义过程包括对类内各种属性和方法的定义,创建类的对象,也包括类间的各种关系和接口的定义。
上机实践3-实验1 类封装
编写一个Java应用程序,该程序中有3个类:Trangle、Lader和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:
(1)Trangle类具有类型为double的三个边,以及周长、面积属性,Trangle类具有返回周长、面积以及修改三个边得功能。另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个数能够构成一个三角形。
(2)Lader类具有类型为double的上底、下底、高、面积属性,具有返回面积的功能。
(3)Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。
实验后练习:
- (1)程序中仅仅省略【代码15】,编译能通过吗?
- (2)程序中仅仅省略【代码16】,编译能通过吗?
- (3)程序中仅仅省略【代码15】,运行时出现怎样的异常提示?
- (4)给Trangle类增加3个方法,分别用来返回3个边:sideA、sideB和sideC.
- (5)让AreaAndLength类中的circle对象调用方法修改半径,然后输出修改后的半径以及修改半径后的圆的面积和周长。
上机实践3-实验2 实例成员与类成员
Example.java
class A
{
【代码1】 //声明一个float型实例变量a
【代码2】
//声明一个float型类变量b,即static变量b
void setA(float a)
{
【代码3】 //将参数a的值赋值给成员变量a
}
void setB(float b)
{
【代码4】//将参数b的值赋值给成员变量b
}
float getA()
{
return a;
}
float getB()
{
return b;
}
void inputA()
{
System.out.println(a);
}
static void inputB()
{
System.out.println(b);
}
}
public class Example
{
public static void main(String args[])
{
【代码5】
//通过类名操作类变量b,并赋值100
【代码6】
//通过类名调用方法inputB()
A cat=new A();
A dog=new A();
【代码7】
//cat调用方法setA(int a)将cat的成员a的值设置为200
【代码8】
//cat调用方法setB(int b)将cat的成员b的值设置为400
【代码9】
//dog象调用方法setA(int a)将dog的成员a的值设置为150
【代码10】
//dog调用方法setB(int b)将dog的成员b的值设置为300
【代码11】 //cat调用inputA()。
【代码12】 //cat调用inputB()。
【代码13】 //dog调用inputA()。
【代码14】 //dog调用inputB()。
}
}
实验后的练习:
- (1)将inputA()方法中的System. out.println(a); 改写为System.out.println(a+b); 编译是否出错?为什么?
- (2)将inputB()方法中的System.out.println(b); 改写为System. out.println(a+b); 编译是否出错?为什么?
上机实践3-实验3 使用package语句和import语句
SunRise.java
import tom.jiafei.*;
class SunRise
{
public static void main(String args[ ])
{
SquareEquation equation=new SquareEquation(4,5,1);
equation.getRoots();
equation.setCoefficient(-3,4,5);
equation.getRoots();
}
}