Java-包和封装、静态变量和方法、代码块和内部类

书接上回的类与对象详解-类与对象传送门

目录

一、封装

1.封装概念

2.权限操作符private 

二、包

1.包的概念

2.包的创建及调用

3.权限操作符default(默认)

三、静态相关

1.静态成员变量和静态成员方法

四、代码块

1.普通代码块

2.构造(实例)代码块 

3.静态代码块

五、内部类

1.实例内部类

2.静态内部类

3.局部内部类

六、快捷键

Constructor

Getter

Setter

Getter and Setter

toString()


一、封装

1.封装概念

    将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。   (大概就是这么个意思 ,看不懂直接看private)

2.权限操作符private 

    private可以修饰变量和方法,被private修饰的变量和方法只能在本类中使用

    例:实现封装

 我们可以看到被private修饰的变量吗,在类外无法被调用了,但是封装仍要求对外公开接口来和对象交互。所以

class Student{
    private String name;
    private int grade;

    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }//构造方法 输入 变量在类内使用 所以没问题 有一个快捷键可以快速完成这个过程(在后面的有)

    @Override//这段函数是改写,为了让它可以直接输出,看不懂没关系,(会在后面快捷键里面详细阐述)
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }
}

public class TEST {
    public static void main(String[] args) {
        Student st1 = new Student("zhangsan",59);
        System.out.println(st1);
    }
}

就完成了封装

二、包

1.包的概念

   为了更好的管理类,把多个类收集在一起成为一组,成为软件包。(可以直接理解为文件夹)

2.包的创建及调用

   选中一个路径-New-Package即可创建一个包

  包(类)的调用:

         我们来用Scanner方法对应的包来举例(我们调用Scanner时会自动导入一个包)

import java.util.Scanner;

        import:是关键字

        java.util 是包的路径

        Scanner 是包里面的需要被调用的类

如果我们想自己在一个包里面调用另一个包的话

       首先我们创建Demon1和Demon2两个包;然后在里面分别建立一个test1和test2;

test1:

在test1里面创建包

在test2里面直接调用

编译错误,如果在开头加上

import Demon1.Student;

 程序即可正常编译

注意点1.如果不写类名而是直接在路径后用.*   即为引用此包里面所有类

           2.import后面的路径 从不同的地方开始写,比如说我这个Demon1的路径和Demon2都在src路径下,所以src及其之外的路径不用写;

3.权限操作符default(默认)

   如果直接定义 int a = 10;或者default int a = 10;都是使这个变量(方法)的权限为包访问权限。

    包访问权限: 能且只能在当前包里面使用 

    上面的例子中的两个变量就是包访问权限,如果调用了一个包,就可以看成被调用的包属于本包了;

三、静态相关

1.静态成员变量和静态成员方法

   被static修饰的变量或者方法就从成员变量(方法)转化为类变量(方法);就是在类里面的变量(方法)(由所有同类变量(方法)共享);

   static应在权限操作符后,例如:public stastic  int a;

   使用时不需要实例化,直接用 类名.变量(方法)名即可;

 一般方法可以访问静态的成员变量和成员方法

 静态方法中不能访问非静态的成员变量和成员方法

你想啊,当静态方法被调用的时候,非静态成员变量和成员方法还没被实例化呢,怎么访问

四、代码块

1.普通代码块

    定义在方法内部的代码块

  public static void main(String[] args) {
        {
            System.out.println("我是代码块");
        }
    }

  就一个花括号 ,加上里面的代码,就是一个代码块

2.构造(实例)代码块 

  在类里面的代码块

class Student{
    public static String name;
    private static int grade;

    {
        System.out.println("我是实例代码块");
    }
    
}

只要实例化一个类 就会运行一次

优先于构造方法执行

3.静态代码块

定义在类里面的,用static修饰的代码块

class Student{
    public static String name;
    private static int grade;

    static{
        System.out.println("我是静态代码块");
    }
    
}

比实例代码块更早执行

不管实例多少个对象 都只执行一次静态代码块

如果有多个静态的代码块会根据定义的顺序进行执行

静态代码块中只能引用静态成员变量和成员方法,不能引用非静态的成员变量和成员方法

五、内部类

1.实例内部类

   在类里面再定义一个类

   创建:

class Student{
    String name;
    int grade;

    class stu{
        String name;
        int grade;
    }

}

   使用:内部类和成员是一个等级 所以得通过实例化后 才能引用

public static void main(String[] args) {
        Student student = new Student();
        Student.Stu stu = student.new Stu();
    }

解释:先实例化一个Student类的变量student

然后Student.Stu是它(stu这个变量)的类,在student变量对应空间里面新建一个Stu类的变量

内部类里面没有静态变量和静态方法;(实例化后才能使用,而静态变量和静态方法在实例化之前就有了)

2.静态内部类

只能访问外部类的静态的成员 一般成员访问不了

class Student{
    String name;
    int grade;

    static class stu{
        String name;
        int grade;
    }

}

使用方法

Student.Stu stu  = new Student.Stu();

因为不用实例化 所以不在变量里面再创建 直接new就可以

3.局部内部类

在方法内部创建一个类,不常用

六、快捷键

Constructor

   类内右键-Generate-Constructor-选择对应变量(按住shift再点击可以多选)即可创建一个初始化变量的构造方法

Getter

    类内右键-Generate-Getterr-选择对应变量 可以创建对应变量的输入方法(用private修饰的变量也可以) 

Setter

类内右键-Generate-Setterr-选择对应变量 可以创建对应变量的输出方法(用private修饰的变量也可以) 

Getter and Setter

    类内右键-Generate-Getter and Setter-选择对应变量 可以创建对应变量的输入和输出方法(用private修饰的变量也可以)

toString()

  类内右键-Generate-toString()-选择对应变量   可以让实例化后的类名的值为 类名{变量列表}

class Student{
    String name = "zhangsan";
    int grade = 59;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }
}

public class TEST {
    public static void main(String[] args) {
        Student stu  = new Student();
        System.out.println(stu);
    }
}

输出结果

猜你喜欢

转载自blog.csdn.net/chara9885/article/details/126091131