包,final,权限修饰符,代码块(Java笔记)
包
什么是包
包就是文件夹,用来管理不同功能的lava类,方便后期代码维护
- 包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意
package com.itheima.domain//黑马的包名
package表示包,后面再跟着的就是包名
package com。itheima。domain
public class Student{
私有化成员变量
构造方法
成员方法
}
在使用一个类的时候,是把包名也加上的,因为在很多包中,会有相同名字的类,如果只写类名,会辨别不出来来自于那个包中,只有加上包名才能是唯一的。
此时,像com.itheima.domain.Student
这种包名加类名称为全类名,或者叫做全限定名,可以理解为类真正的名字
- 使用其他类的规则:使用其他类时,需要使用全类名
public class Teat{
public static void main(String[] args){
com.itheima.domain.Student s = new com.itheima.Student();
}
}
这种完全写起来过于麻烦,于是有了导包(import)
import com.itheima.domain.Student;
public class Teat{
public static void main(String[] args){
Student s = new Student();
}
}
导包不是所有情况都可以直接导包的,有一定的规则
-
使用同一个包中的类别时,不需要导包
Java会默认到本包中找
-
使用
java.lang
包中的类时,不需要导包java.lang
的包属于Java的核心包,可以直接使用。String类就属于java,lang
包 -
其他情况都需要导包
-
如果同时使用两个包中的同名类,需要用全类名
-
总结
-
包的作用
包就是文件夹,用来管理各种不同功能的Java类,不同功能的类放到不同的包中
-
包名书写的规则
公司域名的反写+包的作用,需要全部英文大小写,见名知意
-
什么是全类名
包名+类名
-
什么时候需要导包?什么时候不需要导包?
- 使用同一个包中的类别时,不需要导包
- 使用
java.lang
包中的类时,不需要导包 - 其他情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
-
final
final,表示是最终的,在代码中表示是不可被改变的,可以修饰方法,类,变量。
- 修饰方法表示该方法是最终方法,不能被重写
- 修饰类表示该类是最终类,不能被继承
- 修饰变量时叫做常量,只能被手动赋值一次
当方法表示一种规则,不希望别人去改变的时候,就可以用final
来修饰
当类中的所有方法都不希望被别人重写的时候,就可以用final
来修饰
常量:实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
- 常量的命名规则
- 单个单词:全部大写
- 多个单词:全部大写,单词之间用下划线隔开
final
修饰的变量时基本类型,那么变量存储的数据值不能发生改变
final
修饰的变量是引用类型,那么变量存储的地址值不能发生改变,对象内部属性值的可以改变
引用类型里面存储的是地址值,根据地址值找属性值
总结:
-
final
修饰方法:最终方法,不能被重写 -
final
修饰类:最终类,不能被继承 -
final
修饰变量:是常量,不能被修改基本数据类型:变量的值不能被修改
引用数据类型:地址符不能修改,内部的属性值可以修改
权限修饰符
权限修饰符:是用来控制一个成员能够被访问的范围的
可以修饰成员变量,方法,构造方法,内部类
- 权限修饰符的分类:有四种作用范围的由小到大(
private
<空着不写<protected
<public
)
修饰符 | 同一个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
空着不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 权限修饰符的使用规则:实际开发中,一般只用
private
和public
- 成员变量私有
- 方法公开
- 特例:如果方法中的代码是抽取其他方法中的共性代码,这个方法一般也私有
代码块
-
局部代码块
public static CodeBlockDemo1{ { int a = 10; } System.out.println(a); }
变量a就是在一个局部代码块中,局部代码块运行结束直接清除,所有输出会报错
-
构造代码块
构造代码块就是写在成员位置的代码块,优先于构造方法执行
作用:可以把多个构造方法中重复的代码抽取出来
执行时机:在创建本类对象的时候会先执行构造代码块
代码解释:
public class Student{ private String name; private int age; public Student(){ System.out,println("开始创建对象"); } public Student(String name,int age){ System.out,println("开始创建对象"); this.name = name; this,age = age; } public String getName(){ return name; } …… }
这个代码的两个构造方法中都有输出语句
System.out,println("开始创建对象");
,此时的输出语句可以单独提出,形成构造代码块。public class Student{ private String name; private int age; { System.out,println("开始创建对象"); } public Student(){ } public Student(String name,int age){ this.name = name; this,age = age; } public String getName(){ return name; } …… }
这种写法不是十分灵活,当有三个构造方法并且只有前两个需要有相同的代码的时候,这种写法就没法顾全,此时可以进行一些优化
public class Student{
private String name;
private int age;
public Student(){
this(null,0);
}
public Student(String name,int age){
System.out,println("开始创建对象");
this.name = name;
this,age = age;
}
public String getName(){
return name;
}
……
}
此时无参构造里面的this指向有参构造,意思是调用了其他构造。
还有一种办法就是直接将共同的写成方法,需要的直接调用
-
静态代码块
格式:
static{}
特点:需要通过
static
关键字修饰,随着类的加载而加载,并且自动触发,只执行一次使用场景:在类加载的时候,做一些数据初始化的时候使用。
静态代码块初始化比在方法中初始化要相对安全,因为方法的初始化是公共的,有可能被反复调用
通过这图可以发现,静态代码块并没有跟构造代码块一样,静态代码块只是执行了一次
总结:
-
代码块的分类
局部代码块,构造代码块,静态代码块
-
局部代码块的作用
提前结束变量的生命周期(基本淘汰)
-
构造代码块的作用
抽取构造方法中的重复代码(不够灵活)
-
静态代码块的作用
数据的初始化(重点)
法中初始化要相对安全,因为方法的初始化是公共的,有可能被反复调用
[外链图片转存中…(img-wXvcds7r-1672233861278)]
通过这图可以发现,静态代码块并没有跟构造代码块一样,静态代码块只是执行了一次
总结:
-
代码块的分类
局部代码块,构造代码块,静态代码块
-
局部代码块的作用
提前结束变量的生命周期(基本淘汰)
-
构造代码块的作用
抽取构造方法中的重复代码(不够灵活)
-
静态代码块的作用
数据的初始化(重点)