【Java】类与对象(续)

目录

1.认识包

1.1包的定义

1.2导包

2.封装

2.1封装的概念

2.2访问限定符

3.static关键字

3.1使用static修饰该成员变量

3.2 静态成员变量的访问.

3.3 static修饰成员方法

4.代码块

4.1代码块的概念以及分类

4.2普通代码块

4.3构造代码块

4.4静态代码块

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加载类时开辟空间并初始化的
• 如果⼀个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
• 实例代码块只有在创建对象时才会执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值