飞道的博客

学习Java,你需要知道这些——类与对象

592人阅读  评论(0)

类声明与对象创建

类与对象的关系

  • 类是对一类对象的描述
  • 对象是嘞的具体实例

类声明

  • 方括号中的内容为可选项
[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的作用是:
    1. 在内存中为Clock类型的对象分配内存空间;
    2. 返回对象的引用。
  • 引用变量可以被赋以空值
    例如: 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]
{
	方法体
}
  1. publicprotectedprivate 控制访问权限。
  2. static指明这是一个类方法(静态方法)。
  3. final指明这是一一个终结方法。
  4. abstract指明这是一个抽象方法。
  5. native用来集成java代码和其它语言的代码(本课程不涉及)。
  6. 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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场