java 基础知识2

本文深入探讨了Java中的final类、final方法、final成员变量以及static类、static方法和static变量的基本概念和用法。包括final类与final方法的特性、final变量的常量属性、static变量与static方法的全局特性以及数组与方法的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Final 和static

1.      final类不能被继承,没有子类,final类中的方法默认是final的

2.      final方法不能被子类的方法覆盖,但可以被继承

3.      final成员变量表示常量,只能被赋值一次,复制后值不再改变

4.      final不能用于修饰构造方法

注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型方法默认是final类型的

Final类

不能被继承,final类中的方法没有机会被覆盖,默认是final的

final方法

如果一个类不允许子类覆盖某些方法,则可以把这个方法声明为final方法

使用final方法的原因:

1.      把方法锁定,防止任何继承类修改它的意义和实现

2.      高效,编译器在遇到调用final方法时会转入内嵌机制,大大提高执行效率

Final变量

Final修饰的变量有三种,静态变量、实例变量和局部变量,分别表示三种类型的常量

 Final参数

当函数参数为final类型时。可以读取该参数,但无法改变该参数的值

Public void test( final int i){
	//i++; i是final类型的,值不允许改变的
	}

Static

Static表示“全局”或静态的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是java语言中没有全局变量的概念

 

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说它不依赖于特定的实例,被类的所有实例共享。只要这个类被加载,java虚拟机就能根据类名在运行时数据区的方法区内定找到,因此static对象可以在它的任何对象创建之前访问,无需引用任何对象

用public 修饰的static成员变量和成员方法本质是全局变量和全局方法,

当声明它类的对象时,不生成static变量的副本,而是所有的实例共享同一final变量

Static变量前可以有private修饰,表示这个变量不能再其他类直接访问

1.      static 变量

类成员变量分为被static修身的变量,称为静态变量或类变量,没有被static修饰变量,叫实例变量区别:

对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中王城静态变量的内存分配,可用类名直接访问,当然也可以通过对象来访问

对于实例变量,每创建一个实例都会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响

2.       静态方法

可以直接通过类名调用,任何的实例也都可以调用,静态方法不能用this和super关键字,不能直接访问不带static的成员变量和成员方法

因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract

3.       Static代码块

也叫静态代码块,是类中独立于类成员的static语句块,JVm加载类时会执行这些代码

数组

1.      数组中元素类型必须相同

2.      数组的长度一旦指定即不能改变

3.      数组中的值通过数组名和下表组合起来进行访问

数组类型变量的声明
int[] a = null,a1;//引用类型变量一定要指向一个对象
		int b[]=null,b1;//b1是int类型的变量,b是int类型数组
		//a = {1,2,3}  数组常量只能使用在初始化中
		a = new int[]{1,2,3};//直接给数组元素初始化,a存储的是数组的首元素的内存地址
		int[] c = {1,2,3};
		a1 = new int[3];//创建元素并没有初始化

静态初始化和动态初始化

静态初始化也称数组的整体赋值

语法格式:

数据类型[] 数据名称 = {值1,值2,…….值n}

静态初始化必须和数组的声明位于同一行,即只能在声明数组的同时进行静态初始化

动态初始化。

只为数组指定长度,并在内存中申请空间

数据类型[] 数组名称 = new 数据类型[长度

方法(method)

在面向过程的语言中称作函数。在汇编语言中称作子程序,是一个代码功能块,实现某些特定功能

方法声明的语法格式:

访问控制符 [修饰符] 返回值类型方法名称(参数列表){

          方法体

}

1.      访问控制符

范围从大到小:public ,protected,无访问控制符,private

 

2.      修饰符可选。是为方法增加特定的语法功能

1)  Static  静态的

2)   Final 最终的

3)  Abstract 抽象的

4)  Synchronized  同步的

5)  Native 本地的

 

方法相同指方法名称和参数列表都相同

参数传递:

在参数传递时分为按值传递,按址传递

1.      按值传递(by value)

按值传递指每次传递参数时,把参数的原始数据拷贝一份新的,把新拷贝的数值传递到方法内部,在方法内部修改时,则修改拷贝出来的值而原始的值不发生改变

         说明:使用该方式传递的参数,参数原始的值不发生改变

八种基本数据类型和String

2.      按址传递(by address)

每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址对应存储区域的内容。当方法内部改变了参数值后,参数原始的值发生改变

除String之外的所有复合数据类型,包括数组、类和接口

java 只有值传递

可变长参数:

1.      定义:例如

Print(String… args){

}

2 调用

调用时可以给任意多个参数也可不给参数

3.      使用规则

(1)      调用方法时,如果能够和固定参数的方法匹配,也能与可变长参数的方法匹配,则选择固定参数的方法

(2)      如果要调用的方法可以和两个可变参数匹配,则出现错误

(3)      一个方法只能有一个可变参数,并且这个可变参数必须是该方法的最后一个参数

4,使用规范:

1)  避免带有变长参数的方法的重载

2)  避免使用null值和空值


覆写必须满足的条件:

1)      重写方法不能缩小访问权限

2)      参数列表必须与被重写方法相同(包括显示形式)

3)      返回类型必须与被重写方法相同或是其子类

4)      重写方法不能抛出新的异常或者超过了父类范围的异常,但可以抛出更少更有限的异常


迭代和递归区别:

递归是重复调用函数自身实现循环,迭代是函数内某段代码实现循环,而迭代与普通循环区别是:其循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值

public 
               //public static void main(String...a){  正确
		//public static void main(String.* a){  错误
		//public static void main(String... a){ 正确
		//public static void main(String[]... a){  编译通过
	 	//public static void main(String... a[]){  错误
		public static void main(){
	 		System.out.println("cc");
	 	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值