类声明与对象创建
类与对象的关系
- 类是对一类对象的描述
- 对象是嘞的具体实例
类声明
- 方括号中的内容为可选项
[public] [abstract| final] class类名称 [extends父类名称][implements接口名称列表]
{
数据成员声明及初始化;
方法声明及方法体;
}
- class
- 表明其后声明的是一个类
- extends
- 如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后
- implements
- 如果所声明的类要实现某些接口, 那么,接口的名字应写在
implements之后
- 如果所声明的类要实现某些接口, 那么,接口的名字应写在
- public
- 表明此类为公有类
- abstract
- 指明此类为抽象类
- final
- 指明此类为终结类,不可被继承
钟表类:
public class Clock {
//变量成员
int hour ;
int minute ;
int second ;
//方法成员
public void setTime(int newH, int newM, int newS){
hour= newH ;
minute= newM ;
second= newS ;
}
public void showTime() {
System.out.println(hour+ "." + minute+"." +second);
}
}
其中hour
,minute
,second
为钟表类的属性,setTime
,showTime
为钟表类的行为。
对象引用声明
- 语法
类名 引用变量名; - 例
Clock是已经声明的类名,声明引用变量aclock ,用于存储该类对象的引用: Clock aclock; - 声明一个引用变量时并没有生成对象。
对象的创建
- 语法形式:
new <类名>() - 例如:
aclock=new Clock()- new的作用是:
- 在内存中为Clock类型的对象分配内存空间;
- 返回对象的引用。
- 引用变量可以被赋以空值
例如: aclock=null;
数据成员
- 数据成员
1.表示对象的状态
2.可以是任意的数据类型
数据成员声明
- 语法形式
[public | protected | private]
[static][ final][transient] [volatile]
数据类型变量名1[=变量初值],变量名2[=变量初值];
- 说明
1.public、 protected、 private 为访问控制符。
2.static指明这是一 个静态成员变量(类变量)。
3.final指明变量的值不能被修改。
4.transient指明变量是不需要序列化的.
5.volatile知名变量是一个共享变量
实例变量
1.没有static修饰的变量(数据成员)称为实例变量;
2.存储所有实例都需要的属性,不同实例的属性值可能不同;
3.可通过下面的表达式访问
- 实例属性的值<实例名> < 实例变量名 >
类变量(静态变量)
1.用static修饰。
2.在整个类中只有一一个值。
3.类初始化的同时就被赋值。
- 适用情况
类中所有对象都相同的属性。
经常需要共享的数据。
系统中用到的一 些常量值。 - 引用格式
<类名|实例名>. <类变量名>
例:
public class Circle{
static double PI = 3.1415926
int redius;
}
其中PI为类变量。
方法成员
语法形式
[public | protected | private][static] [final][abstract] [native] [synchronized]
返回类型方法名([参数列表]) [throws exceptionList]
{
方法体
}
public
、protected
、private
控制访问权限。static
指明这是一个类方法(静态方法)。final
指明这是一一个终结方法。abstract
指明这是一个抽象方法。native
用来集成java代码和其它语言的代码(本课程不涉及)。synchronized
用来控制多个并发线程对共享数据的访问。
- 返回类型
- 方法返回值的类型,可以是任意的Java数据类型;
- 当不需要返回值时,返回类型为void。
- 参数类型
- 简单数据类型、引用类型(数组、类或接口) ;
- 可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数。
- 方法体
- 方法的实现;
- 包括局部变量的声明以及所有合法的Java语句;
- 局部变量的作用域只在该方法内部。
- throws exceptionList
- 抛出异常列表。
实例方法
- 表示特定对象的行为;
- 声明时前面不加static修饰符;
- 实例方法调用
给对象发消息,使用对象的某个行为/功能:调用对象的某个方法。 - 实例方法调用格式
<对象名>.<方法名> ( [参数列表] )
<对象名>为消息的接收者。 - 参数传递
值传递:参数类型为基本数据类型时
引用传递:参数类型为对象类型或数组时
具有实例方法的圆类:
public class Circle {
static double PI = 3.1415926;
int radius;
public double circumference(){ //求圆周长
return 2*PI*radius;
}
public void enlarge(int factor){ //把圆扩大factor倍
radius = radius*factor;
}
public boolean fitsInside (Rectangle r) { //判断能否被长方形包围
return (2 *radius < r.width) && (2* radius < r.height);
}
}
其中有三个实例方法,fitsInside
方法的参数类型为对象。
类方法
- 也称为静态方法,声明时前面需加static修饰。
- 不能被声明为抽象的。
- 可以类名直接调用,也可用类实例调用。
例:将摄氏温度(centigrade)转换成华氏温度(fahrenheit)
- 转换公式为fahrenheit = centigrade * 9 /5 + 32,除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法
转换方法centigrade ToFahrenheit
放在类Converter
中
public class Converter {
public static int centigradeToFahrenheit(int cent)
{
return (cent*9/ 5 + 32);
}
}
方法调用
Converter.centigradeToFahrenheit(40)
包
- 包是一组类的集合。
- 一个包可以包含若干个类文件,还可包含若干个包。
包的作用
- 将相关的源代码文件组织在一起。
- 类名的空间管理,利用包来划分名字空间可以避免类名冲突。
- 提供包一级的封装及存取权限。
包的命名
- 每个包的名称必须是"独一无二”的。
- Java中包名使用小写字母表示。
- 命名方式建议
- 将机构的Internet域名反序,作为包名的前导;
- 若包名中有任何不可用于标识符的字符,用下划线替代;
- 若包名中的任何部分与关键字冲突,后缀下划线;
- 若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线。
编译单元
- 一个Java源代码文件称为一一个编译单元,由三部分组成:
- 所属包的声明(省略,则属于默认包);
- Import (引入)包的声明,用于导入外部的类;
- 类和接口的声明。
- 一个编译单元中只能有一个public类,该类名与文件名相同,编译单元中的其他类往往是public类的辅助类,经过编译,每个类都会产生一个class文件。
包的声明
- 命名的包( Named Packages )
例如: package Mypackage; - 默认包(未命名的包)
不含有包声明的编译单元是默认包的一部分。
包与目录
- 包名就是文件夹名,即目录名;
- 目录名并不一定是包名;
假如我建了一个com.sd.db的包
那么就会自动生成一个com>sd>db的目录
引入包
- 为了使用其它包中所提供的类,需要使用import语句引入所需要的类。
- Java编译 器为所有程序自动引入包java.lang。
- import语句的格式:
import package1[.packae...]. (classname |*);
1.package1[.package…]表明包的层次,对应于文件目录;
2.classname指明所要引入的类名;
3.如果要引入一个包中的所有类,可以使用星号(*)来代替类名。
类的访问权限控制
- 类的访问权限控制
类型 | 无修饰(默认) | public |
---|---|---|
同一包中的类 | 是 | 是 |
不同包中的类 | 否 | 是 |
类的成员访问权限控制
- 公有(public)
可以被其他任何方法访问(前提是对类成员所属的类有访问权限) - 保护(protected)
只可被同一类及其子类的方法访问 - 私有(private)
只可被同一类的方法访问 - 默认(default)
仅允许同一个包内的访问;又被称为“包( package)访问权限”
类成员在不同范围是否可以被访问
类型 | private | 无修饰 | protected | public |
---|---|---|---|---|
同一类 | 是 | 是 | 是 | 是 |
同一包中的子类 | 否 | 是 | 是 | 是 |
同一包中的非子类 | 否 | 是 | 是 | 是 |
不同包中的子类 | 否 | 否 | 是 | 是 |
不同包中的非子类 | 否 | 否 | 否 | 是 |
例:圆类
public Class Circle {
static double PI = 3.14159265;
private int radius;
public doyble circumference() {
return 2 * PI * radius;
}
}
其他的public类中无法访问该类中的radius
属性。
如果想要访问:
- get方法
功能是取得属性变量的值。get方法名以get
开头,后面是实例变量的名字
例如:
public int getRadius(){
return radius;
}
- set方法
功能是修改属性变量的值。set方法名以set
开头,后面是实例变量的名字
例如:
public void setRadius(int r){
radius = r;
}
this关键字
- 如果方法内的局部变量(包括形参)名与实例变量名相同,则方法体内访问实例变量时需要this关键字。
例如:
public void setRadius(int radius){
this.radius = radius;
}
对象初始化
- 对象初始化
系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化 - 对象回收
对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收
构造方法
- 方法名与类名相同;
- 不定义返回类型;
- 通常被声明为公有的(public) ;
- 可以有任意多个参数;
- 主要作用是完成对象的初始化工作;
- 不能在程序中显式的调用;
- 在生成一个对象时 ,会自动调用该类的构造方法为新对象初始化;若末显式声明构造方法,编译器隐含生成默认的构造方法。
默认构造方法
- 没有参数(内部类除外),方法体为空;
- 使用默认的构造方法初始化对象时,如果在类声明中没有给实
例变量赋初值,则对象的属性值为零或空;
自定义构造方法与方法重载
- 在生成对象时给构造方法传送初始值,为对象进行初始化。
- 构造方法可以被重载
一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,可以通过参数列表的
不同来辨别应调用哪一个方法。 - 只要显式声明了构造方法,编译器就不再生成默认的构造方法。
- 也可以显式声明无参数的造方法,方法体中可以定义默认初始
化方式。
例:
public class BankAccount {
String ownerName;
int accountNumber;
float balance;
//为BankAccount声明一个有三个参数的构造方法
public BankAccount(String initName, int initAccountNumber, float initBalance) {
ownerName = initName;
accountNumber = initAccountNumber;
balance = initBalance;
}
//假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法
public BankAccount(String initName, int initAccountNumber) {
ownerName = initName;
accountNumber = initAccountNumber;
balance = 0.0f;
}
//无参数的构造方法自定 义默认的初始化方式
public BankAccount() {
ownerName =" ";
accountNumber = 999999;
balance = 0.0f;
}
}
一共定义了三种构造方法,可以看出名字都相同,但是由于参数不同,实现的功能也不同。
转载:https://blog.csdn.net/qq_41505957/article/details/105831964
查看评论