目录
1.认识包
1.1包的定义
(Package)是Java中⼀个组织类的方式,用于防止类名冲突和提高代码的可读性。包允许将类组织在一个层次结构中,类似于文件系统中的目录。
我们用通俗的话来讲,包就类似于一个个文件夹,我们可以把同一类的文件存放在一个文件夹里,比如一个学生可以按照科目将不同的资料存放在对应的科目里。
(在Java中也引入了包,包是对类、接口等的封装机制的体现,是⼀种对类或者接口等的很好的组织方式。)
我们已经知道了包的概念,那么我们该怎样在IDEA里创建一个包呢?
点击Package之后我们就可以自己命名
包创建好之后我们就可以在包内创建类了
我们可以发现在包内新创建的类中多出来一句话:(package+包名)它就是指定该代码在哪一个包中
同样我们可以检查包名和代码路径是否匹配,我们可以发现我们创建了一个demo1的包,代码路径就为demo1,他被放在idea默认的src包下
1.2导包
“导包”指的是使用 import 语句将一个类或接口从一个包中引入到当前的编译单元中,以便在代码中可以直接使用这些类或接口,而不需要每次都写完整的类名或接口名。
如果我们想导入类有以下几种情况
1.导入单个类或接口
2.导入某个包的所有类或接口
这样我们就导入了java.util这个包中的所有类了
3.静态导入(静态导入允许你直接使用类中的静态成员(如静态方法和静态字段),而不需要类名前缀)
但是有时候在导包的过程中也会遇见一些问题,我们来看下面这个代码:
很明显他报错了,这是为什么呢,我们先运行一下看看错误是什么
很明显我们发现 util 和 sql 中都存在⼀个 Date 这样的类,因此无法确定到底引入哪个包中的类,因此编译报错,所以啊这时候我们就得勤快一点使用完整的类名
这样是不是就没有报错啦。
2.封装
2.1封装的概念
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互,简单来说就是套壳屏蔽细节。
接下来我们通过代码演示
我们创建了一个Dog类,并用private修饰name,当我们想要去访问name时却报错了,这就是封装起到了作用,被private修饰过的对象只能在当前类中引用,那我们如何在Test类中访问呢?
此时只能手动提供get和set方法作为公开的接口来进行访问
这样我们就可以正常访问了
我们可以使用快捷键Alt+Insert 快速生成get和set函数
2.2访问限定符
上面我们提到了private,那么它究竟是什么呢?我们需要了解一个概念叫访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
我们可以拿用简单的比喻来理解这四个访问限定符,假如你有一个“秘密基地”
public:这个秘密基地是公开的,所有人都知道
protected:这个秘密基地除了自家人知道,你的好朋友也知道,但是他的父母不知道
default:这个秘密基地只有自家人知道
private:这个秘密基地只有你自己知道
3.static关键字
3.1使用static修饰该成员变量
我们看上面这段代码,我们定义了一个Student类,这个类里有三个学生,但是我们发现除了姓名年龄不同,他们都在一个班级,如果有50个同学他们都在这个班,每次都对classroom进行初始化是在说太麻烦了,那么我们该如何改进呢?这时就要用到static
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
3.2 静态成员变量的访问
我们对代码进行了简单的修改:用类名.静态成员变量的方式进行访问
【静态成员变量特性】
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但⼀般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
3.3 static修饰成员方法
我们还发现第十行代码static修饰了成员方法,这说明static还能修饰成员方法:Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
【静态方法特性】
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
3.4 static成员变量初始化
注意:static成员变量不可以放在构造方法中来初始化,因为构造方法是一个类创建实例化对象的时候自动调用的方法,而静态成员变量和对象这个概念压根不搭边,也就不可以在构造方法中调用.
他的初始化方法只有两种,就地初始化和静态代码块初始化
1.就地初始化是指:在定义的时候就给出初始值,就如上面的“学生类”
2.静态代码块初始化
4.代码块
4.1代码块的概念以及分类
使用{}定义的一段代码称为代码块,代码块可以分为以下四种:
- 普通代码块
- 构造代码块
- 静态代码块
- 同步代码块(后续会讲)
4.2普通代码块:定义在方法中的代码块,这类代码块不需要条件,一定会被执行,但是这种代码块相对少见
public class Main{
public static void main(String[] args) {
{ //直接使⽤{}定义,普通⽅法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
// 执⾏结果
x1 = 10
x2 = 100
4.3构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块⼀般用于初始化实例成员变量。
public class Student{
//实例成员变量
private String name;
private String gender;
private int age;
private double score;
public Student() {
System.out.println("好好学习天天向上");
}
//实例代码块
{
this.name = "小明";
this.age = 18;
this.sex = "man";
System.out.println("好好学习天天向上");
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main {
public static void main(String[] args) {
Student stu = new Student();
stu.show();
}
}
// 运⾏结果
好好学习天天向上
好好学习天天向上
name: 小明 age: 18 sex: man
4.4 静态代码块
使用static定义的代码块称为静态代码块。⼀般用于初始化静态成员变量。
public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom;
// 静态代码块
static {
classRoom = "117";
System.out.println("好好学习天天向上");
}
public Student(){
System.out.println("好好学习天天向上");
}
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
}
}
【注意事项】
• 静态代码块不管生成多少个对象,其只会执行⼀次
• 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
• 如果⼀个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
• 实例代码块只有在创建对象时才会执行