书接上回的类与对象详解-类与对象传送门
目录
一、封装
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);
}
}
输出结果