类和对象一(从封装开始讲述)

2024-10-09 15:25:35 浏览数 (1)

一.封装:封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。

下面给一段,用private封装成员变量,的代码:这里用private把他们封装起来,封装后提供,get,set公开接口来给予部分功能访问。

代码语言:javascript复制
class Student {
    //用private把他们封装起来
    private String name;
    private int age;
    private int id;
    public static String className;
    public void doClass (){

    }

    public Student(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    //封装后提供,get,set公开接口来给予部分功能访问
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

二.封装扩展之包:

1.在面向对象体系中,提出了一个软件包的概念,即: 为了更好的管理类,把多个类收集在一起成为一组,称为软件 。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。 (总之包就是文件夹)。下面可以理解一下

2. 在 Java 中也引入了包, 包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式 ,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用: 在同一个工程中允许存在相同名称的类,只要处在不同的包中即可(可以解决相同名称的类重名)。

3. 可以 使用 import 语句导入包 .

代码语言:javascript复制
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}

如果需要使用 java.util 中的其他类 , 可以使用 import java.util.* 这里 "*" 是 通配符.  (但是我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.)

代码语言:javascript复制
import java.util.*;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}

5.可以使用import static导入包中静态的方法和字段。代码如下:

注意事项 : import 和 C 的 #include 差别很大 . C 必须 #include 来引入其他文件内容 , 但是 Java 不需要。

import 只是为了写代码的时候更方便 . import 更类似于 C 的 namespace 和 using

代码语言:javascript复制
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2)   Math.pow(y, 2));
double result = sqrt(pow(x, 2)   pow(y, 2));
System.out.println(result);
}
}

二.自定义包:

1.在文件的最上方加上一个 package 语句指定该代码在哪个包中 .

包名需要尽量指定成唯一的名字 , 通常会用公司的域名的颠倒形式 ( 例如 com.bit.demo1 ).

2. 先在 IDEA 中先新建一个包 : 右键 src -> 新建 -> 包. 再在 弹出的对话框中输入包名 最后在 包中创建类 , 右键包名 -> 新建 -> 类 , 然后输入类名即可

3.自定义的包可以,自己实例化并且使用

三.访问限定符:

1.Java 中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起 ,更符合人类对事物的认

知,而 访问权限用来控制方法或者字段能否直接在类外使用 。 Java 中提供了四种访问限定符:

下面给一张逻辑清晰的图:(prtected下次补上)。

1.如果不加上面的访问限定符就是默认权限,默认权限在同一个包中(也就是同一个文件中)可以相互任意进行访问。下面给几个例子:

 2,如果加上public修饰则在不同包(文件夹)里都可以相互使用。

四.static成员

1.static 修饰的成员变量,称为静态成员变量 ,静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共 享的(所修饰的成员变量位于JVM的方法区里)

2.静态成员变量特性

1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

3. 类变量存储在方法区当中

4. 生命周期伴随类的一生 ( 即:随类的加载而创建,随类的卸载而销毁 )

3.说到加载:源代码储存在磁盘中--》javac编译成字节码文件--》java命令在JVM中运行(这个过程就叫做加载)(这个过程中类不会被重复加载)。

如图:

4.static修饰成员变量访问可以通过对象的引用访,也可以通过类来访问,这里推荐类来访问

具体代码如下:

代码语言:javascript复制
class Student {
    //用private把他们封装起来
    private String name;
    private int age;
    private int id;
    public static String className;
    public void doClass (){

    }

    public Student(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    //封装后提供,get,set公开接口来给予部分功能访问
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void show() {
        System.out.println("姓名"  this.name    "学号"   this.id    "年龄"
                  this.age    " "   "班级"   className);
    }


  public static void main(String[] args) {
        Student student1 = new Student("xiaohua", 12, 23005678);
//        student1.className = "1";

        Student.className = "1班";//学生都属于一班
        student1.show();

        System.out.println(Student.className);

        Student student2 = new Student("xiaohua", 12, 23005678);
//        student1.className = "1";
        student2.show();


        Student student3 = new Student("xiaohua", 12, 23005678);
//        student3.className = "3";
        student3.show();
    }

}

由于被static修饰这里的三个学生都属于同一个班。如图运行结果

这里一班是公用的三个学生的中,调试,如图:

0 人点赞