主页

java类

java类

 

类的声明

 
.java文件存盘的时候,文件名也是区分大小写的。
 
Java规定,如果类前面用public来修饰,那么文件名必须和类名完全相同(包括大小写)。
一个.java文件中,只能有一个public修饰的类,否则报错。
一个.java文件中,当类名与文件名一样时, 这个类默认就是public, 但不建议省略。
 
 [public]? [abstract | final]? class 类名 [extends 父类名]? [implements 接口名1, 接口名2, ...]?  {   
   [private | protected | public]? [static]? [final]? 类型名 变量名[ = 表达式1 [, 变量名[ = 表达式2 ... ]?]?]? ;
     [private | protected | public]?  类名 (类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
     [abstract]? [private | protected | public]? [static]? [final]? 类型名 方法名(类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
}
 
[public]? [abstract | final]? class 类名 [extends 父类名]? [implements 接口名1, 接口名2, ...]? { ... }
笔者建议无论类前面是否有public修饰,文件名也应与类名相同,而且在一个源程序中,只定义一个类。
Java中的类是一种数据类型,地位和用户与基本数据类型是一样的。 如定义两个Point类的变量  Point p1, p2;
 
Java中每个类都有父类,如果定义类时不指定父类,则默认其父类是 Object 类。
 
类修饰符
final: 最终类,表示该类不能被别的类所继承,也就是该类不能有子类,或者说该类不能作为父类。
abstract: 抽像类,允许类中的有0个及以上方法没有被实现,如果不是抽象类,则类体中的全部方法均必须实现。 与 final是互斥的。
public: 公共类,说明本类可以被本类所属的包中的其它类访问。如果不是公共类,则只能被同一包中的其它类所访问。
 
类体和方法体有些相似。
类体可以是空的。
可以在其中定义变量,定义的这些变量称为类的 属性 成员属性 成员变量。成员变量如果没有显示赋值,则在创建对象时,会自动初始化一个默认值。boolean默认为false,数值型变量默认为0,类变量默认为null, char型?字符串?。
可以在其中定义函数,这些函数称为类的成员方法
成员方法和成员变量都是类的成员,可以设置其访问权限: private protected public friendly,不设置则默认为 friendly。private修饰的变量称为私有变量,protected修饰的变量称为保护变量,public修饰的变量称为公共变量
成员变量名 和 成员方法名 是可以相同的,但一般不建议这样用。
static 修饰的成员变量称为类变量,也称为静态成员,是属于类的(存在于类上,而不是其创建的对象上),只能通过 类名.静态变量名 来操作。
 
类体中定义的成员方法,全部会提升到类的顶部。所以先书写的变量初始化表达式中可以调用后书写的方法。
方法本身之间是没有定义的顺序的,因为方法要入栈后才能调用,所以先书写的方法内可以调用后书写的方法或后书写的属性。
但是先书写的成员变属性不能调用后书写的成员属性(可以调用更前面书写的成员属性)。
 

对象

创建   类名  对象名 = new 类名([表达式1[, 表达式2]*]?);
使用 
     读取成员变量:   temp = 对象名.成员变量名; 
     修改成员变量:   对象名.成员变量名 = 表达式;
     调用成员方法:对象名.成员方法名([表达式1[, 表达式2]*]?);
销毁  当这个对象没有任何一个变量引用时,JVM的垃圾回收机制会自动释放其所占空间,无需在程序中手动销毁和回收空间。
 
 

成员的访问权限

这里的访问权限包含了: 静态的、实例的、成员属性、成员方法。

成员方法和成员变量都是类的成员,可以设置其访问权限: private protected public friendly,不设置则默认为 friendly(注意,并没有friendly这个关键字)。private修饰的变量称为私有变量,protected修饰的变量称为保护变量,public修饰的变量称为公共变量, 不显式指定的变量称为默认访问变量
Java中的所有代码必须是写在某个类中的(不存在在类外书写的语句),而这个类也必然属于某个包(不存在不属于某个包的类)。
 
为方便描述,假设在类A中定义了些成员变量,我们讨论这些变量的访问权限。 
定义两个子类: 类ChildInner是类A的子类且两个类在同一包中,类ChildOuter是类A的子类且不在同一包中。
定义两个与类A没有继承关系的类: 类Inner 和 类A在同一个包中。类Outer是和类A不在同一个包中的类。
 
访问类A中实例成员变量的形式仅有以下两中: 
在子类中访问父类A的成员变量 或 在类A中访问类A的成员变量的形式:  [this.]?类A中的成员变量 = 值
在其它非子类关系的类中访问类A中的成员变量的形式:  类A对象.成员变量
 
访问类A中静态成员变量的形式仅有以下两中: 
在子类中访问父类A的成员变量 或 在类A中访问类A的成员变量的形式:  类A中的成员变量 = 值
在其它非子类关系的类中访问类A中的成员变量的形式:  类A对象.静态成员变量类A.静态成员变量   (类A a;   a.静态成员变量)
 
类A中定义的成员变量,在整个类A的类体中均可直接访问,这四个访问权限修饰符只是针对在其它类中访问类A中成员变量的情况。
 
公共变量: 没有限制,类A、类ChildInner、类ChildOuter、类Inner、类Outer 的类体范围内可以访问。
私有变量:   类A的类体中可以访问,类ChildInner、类ChildOuter、类Inner、类Outer 的类体范围内访问报错。
保护变量:  类A、类ChildInner、类ChildOuter、类Inner的类体中可以访问,类Outer 的类体范围内访问报错。
默认访问变量: 类A、类ChildInner、类Inner的类体中可以访问,类ChildOuter、类Outer 的类体范围内访问报错。
也就是下面表格中的规则:
 

成员方法

final修饰的方法称为最终方法。static修饰的方法称为静态方法。
方法的返回值类型可以是void,表示没有返回值。
方法体和方法的声明合起来,称为方法的定义。
方法体中除了可执行语句外,还可以定义属于本方法的局部变量。
方法的返回值通过在方法体中的语句   return [表达式];  返回的。
如果是void类型的方法,则不需要方法体中有return语句,或只能有 return; 这样的语句。
方法的return的值与方法声明中的返回类型,其实是一种赋值关系,所以必须类型兼容。
 
方法的调用
在定义一个方法时,方法声明中的参数列表中的参数称为形式参数,简称形参。
在调用方法时的所书写的参数列表中的参数称为实际参数,简称实参。
Java中,形参和实参的数量必须相等,且相对应的参数必须赋值兼容。
当实参是基本类型时,传递给实参一个副本。而当实参是类类型时,传递的是引用(对象的指针,也就是对象的地址),此时在方法中修改形参,会联动地修改实参。
 

this

在  对象.方法名(3) 调用时,系统内部其实是  对象.方法名(对象, 3)
而在定义方法时  类型 方法名(int a){....} ,系统内部其实是  类型 方法名(类名 this, int a){....} , 所以方法体中可能用 this.成员属性名 来访问成员属性。
当然也可以省略this。直接通过 成员属性名 来访问。 但但局部变量与成员变量同名时,成员变量会被隐藏,此时只能用 this.成员属性名 来访问成员属性。
 
 

构造方法

类名(参数列表1) {
   [this(参数列表2); | super(参数列表3);]?
   语句序列
}
其中 this() 是调用本类的其它构造方法, super() 是调用父类的构造方法。
构造方法不用写返回类型,也不用return一个值。如果前面加上一个类型,就成为了一个普通方法(语法上是正确的)。
构造方法不能用static 和 final来修饰。 但可以用 private(但这会导致无法在外部创建对象)。
构造方法不能由对象显式的调用,一般通过new关键字调用或者用this 或 super 调用。
构造方法的没有参数列表时,称为无参数的构造方法,有参数列表时,称为带参数的构造方法。
构造方法可以进行重载(定义多个,但参数列表必须不一样,在new的时候必须能根据实参列表推断出来是哪个)。
如果用户定义的类中没有提供任何一个构造方法时,系统会自动提供一个无参的构造方法。
 
 

静态方法

以static 修饰的方法
静态方法、静态属性(后面的初始化表达式)只允许访问静态属性和其它静态方法,而不能访问实例属性和实例方法。
实例方法则可以访问实例属性、实例方法、静态属性、静态方法。
 
 

静态代码块

在类体中可以将某一代码块声明为静态的,这样的程序块叫静态初始化段。
static { 语句序列 }
 
静态代码块只能定义在类中,它独立于任何方法,不能定义在方法中。
静态代码块中的变量都是局部变量,只在本块内有效。
静态代码块会在类被加载时自动执行(比任何类中的静态方法先执行,所以会先于main方法执行),而无论加载者是JVM还是其它的类。
一个类中允许多个静态代码块,执行顺序按书写的先后顺序。
静态代码块只能访问类的静态成员,而不允许访问实例成员。 
 
是否有实例代码块??
 

main() 方法

main 方法由JVM调用,是程序的入口。 书写形式基本固定如下所示:
public static void main(String args[]){ ... }
 
在 cmd命令行中 ,  java 类名 [参数1[ [空格|tab]+ 参数n]*]?
这些参数就会传入到main方法的形参args数组中。
例如:  java Helloworld one  two three " a    b "      调用后,对应的 args = ["one", "two", "three", " a    b "]  注意,不包括 java Helloworld
 
 
 

finalize() 方法

如果对象使用了除内存以外的其它资源,如文件或是另一个对象的句柄,必须在对象被自动销毁时,回收这些资源。
Java的Object类中提供了一个finalize()方法,称为结束方法,它会在垃圾收集器清除对象之前被调用。可以重写这个方法,以完成一个资源释放工作。
protected void finalize(){ .... } 
 
但是对象在什么时候被清除是不确定的,所以对于一些短缺的资源,最好手动调用方法来清理。
 
 

本地方法/本机方法

Java程序要调用其它语言编写的代码,调用这些代码的方法被称为本地方法 或 本地方法。
public native static void 方法名(参数列表);
 
本地方法可以声明为实例的或静态的方法。
本地方法只需要声明部分,不需要定义部分,因为它的定义是其其它语言来完成的。
 
 
 
 
 
 
 
 
posted @   平凡人就做平凡事  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示