Java那些必须知道的事儿
文章介绍:
本文讲述了一些Java非常基础但是长时间不用又会模糊拿不定的一些知识点
目录:
- java实例化对象的5种方式
- String中对象实例化方法补充
- 静态变量与动态变量
- 为什么一个Java文件中只能包含一个public类
- public/private/protected的具体区别
- java的8种基础类型
- static关键字
- 理解final关键字
java实例化对象的5种方式
1、用new语句直接创建对象,这是最常见的创建对象的方法。
2、通过工厂方法返回对象,如:String str = String.valueOf(23);
3、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName(“java.lang.Object”).newInstance();
4、调用对象的clone()方法。
5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
举个例子
package com.demo.object;
...
...
public static void main(String[] args) {
/**方法一 : new语句直接创建对象 */
Fruit fruit = new Fruit(1,"苹果",4.2);
System.out.println(fruit.toString());
/**方法三 :运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
* 如:Object obj = Class.forName("java.lang.Object").newInstance();
**/
try {
Fruit fruit2 = (Fruit) Class.forName("com.demo.object.Fruit").newInstance();
fruit2.setId(2);
fruit2.setName("香蕉");
fruit2.setPrice(2.6);
System.out.println(fruit2);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
String中对象实例化方法补充
例:
String stra=“TEAMAG”;
String strb=“TEAMAG”;
System.out.println(stra== strb);//true
String str1=new String(“TEAMAG”);
String str2=new String(“TEAMAG”);
System.out.println(str1== str2);//false
String str3=new String(“TEAMAG”).intern();
String str4=new String(“TEAMAG”).intern();
System.out.println(str3== str4);//true
上述代码结果的原因:
直接赋值:只产生一个实例化对象,并且可以自动保存到对象池中,以实现字符串实例的重用;
构造方法:会产生两个实例化对象,不会自动入池,无法实现对象的重用。用intern()方法可以实现自动入池。
静态变量与动态变量
静态存储与动态存储
1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储
2)静态存储只会初始化一次
3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期
4)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放
区别
定义或者声明变量时,没有static修饰符的就是动态变量,有static修饰符的就是静态变量
动态变量
全局变量
1)在所有函数的外部定义(包括主函数),定义之后的所有函数都能使用,属于静态存储
2)作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。外部文件可以通过extern关键字来声明另一个文件中存在的全局变量
3)生命周期为从程序运行到程序退出,即贯穿整个运行时间
4)无显式初始化时默认初始化值为0
局部变量
1)在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问。
2)作用域为当前函数,从定义位置,到其所在的{}的结束位置
3)生命周期为从函数调用到函数退出
4)无显式初始化时默认初始化值为随机值
静态变量
静态全局变量
1)作用域为当前文件,从定义/声明位置到文件结尾
2)生命周期为从程序运行到程序退出,即贯穿整个运行时间
3)无显式初始化时默认初始化值为0
静态全局变量与动态全局变量的主要不同:
动态全局变量可以通过extern关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。
⚠️在函数fun中定义了一个动态局部变量a,而a同时又是静态全局变量的情况下,作用域小的掩盖作用域大的,所以局部变量会掩盖全局变量。所以动态局部变量a会掩盖静态全局变量a
静态局部变量
1)作用域为当前函数,从定义位置,到其所在的{}的结束位置
2)生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值
静态局部变量与动态局部变量的主要不同:
两者作用域相同,都在函数内部,但是两者生命周期不一样,静态局部变量的生命周期是到程序的结束,而动态局部变量的生命周期是函数的结束,静态局部变量的生命周期更长,同时静态局部变量只会初始化一次,函数重复调用,但静态局部变量不会被重新初始化
为什么一个Java文件中只能包含一个public类
一个编译单元(java文件)可以存在多个类,在编译时产生多个不同的.class文件,.class文件便是程序运行的数据来源。java将public类作为每个编译单元的数据接口,只能有一个,不然不能处理存在多个类的java文件。当一个编译单元(java文件)有多个非public类时,运行时需要对数据来源进行选择。
public/private/protected的具体区别
java的8种基础类型
⚠️ JAVA 基本类型是不可以new的,在数组里面添加元素可以通过new基本类型!
⚠️ 看好 String 不是基础类型!
static关键字
static关键字基本概念
一句话来概括:方便在没有创建对象的情况下来进行调用。
被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。对于这个概念,下面根据static关键字的四个基本使用来描述。
⚠️ 静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存。
⚠️ 非静态方法是属于对象的,对象是在类加载之后创建的。
静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,而静态方法自然不能调用一个不存在的方法。
☑️ 访问:不需要创建对象
☑️ 调用:需要创建对象
main函数是静态的,所以只能访问静态-----这里也是访问,不是调用
1:静态方法只能访问静态-------------这里是访问
2:非静态方法可以访问静态,也可以访问非静态-------------这里也是访问
3:静态方法可以通过类名.直接被调用,也可以通过对象来被调用-----这里是调用
4:而非静态方法只能通过对象来调用-----这里也是调用
static关键字修饰类
java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。下面看看如何使用。
如果没有用static修饰InterClass,则只能new 一个外部类实例。再通过外部实例创建内部类。
static关键字修饰方法
修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用:
static关键字修饰变量
被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。
我们同样可以使用上面的方式进行调用变量:
⚠️ public static StringBuffer Bufcontent = new StringBuffer("");
这种static变量 需要 new 是因为 -> 它不是基础类型,它是一个类!
理解final关键字
final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。
修饰变量
凡是对成员变量或者局部变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。
final修饰基本数据类型的变量时,必须赋予初始值且不能被改变,final修饰引用变量时该引用变量不能再指向其他对象。
修饰方法
final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。
修饰类
使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。
匿名内部类
匿名内部类需要声明时用final
特别鸣谢:
ZhangWen
ZhaoXu
HuChuan
FuYao
ZhangYuMeng
CuiZhengDa
https://www.cnblogs.com/yxj808/p/12679308.html
https://zhidao.baidu.com/question/89449594.html
https://zhidao.baidu.com/question/559963397.html
https://zhidao.baidu.com/question/1052339932111842019.html
https://www.cnblogs.com/xuelin1221/p/10335990.html
https://zhidao.baidu.com/question/1435968651956992699.html
https://blog.csdn.net/MaZhongkai1994/article/details/53047949?utm_source=blogxgwz7
https://blog.csdn.net/luojianjane/article/details/100115670
https://blog.csdn.net/qq_34375473/article/details/81487803
https://baijiahao.baidu.com/s?id=1636927461989417537&wfr=spider&for=pc