温馨提示: 此篇文章需要前两篇文章作为基础。
JAVA系列 小白入门参考资料 类和对象(1)
JAVA系列 小白入门参考资料 类和对象(2)
目录
1. 封装
引入封装
访问修饰符
封装的具体实现
get方法和set方法
编辑2. static关键字
static修饰成员变量
static修饰成员变量的访问
编辑 static修饰成员方法
static修饰成员方法的访问
3. 代码块
代码块概念以及分类
普通代码块
实例代码块
静态代码块
1. 封装
引入封装
我们平时见到的台式计算机只是一个外壳,我们可以接触到的只有开关键。但计算机内部如何去运行,管理,保存数据,我们对此是不了解的。 因此我们可以认为计算机生产厂商,为了保护计算机内部去套壳,既保护了电脑,也保护了计算机内部运行的信息。
下面我们开始正式的讲解封装
我们先写出正常代码
//类
class Student{
//成员属性
String name;
int age;
//成员方法
public void eat(){
System.out.println(this.name + "在吃饭");
}
public void sleep(){
System.out.println(this.name + "在睡觉");
}
public void show(){
System.out.println("姓名 " + this.name + " 年龄 " + this.age);
}
}
//类的使用者
public class Blog {
public static void main(String[] args) {
//实例化一个对象
Student student = new Student();
student.name = "小罗";
student.age = 10;
//调用方法
student.eat();
student.sleep();
student.show();
}
}
这里的Student类 就好比 是前文所说的计算机,而其中的成员变量和成员方法就好比是计算机内部的器件和运行规则。而我们的 Blog 类 就好比是我们自己(实际使用者)。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
访问修饰符
因为实现封装需要修饰符private,在此我们先补充访问修饰符的概念
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问修饰符:public protected 默认修饰符 private
我们以人(小明)为例子来理解访问修饰符
public: 小明的公共信息,比如外貌,衣着打扮,等等。对比Java来说就是所有人都可以访问(没有限制)
默认修饰符: 小明家庭(同一个包)才知道小明的信息(秘密)。
private:小明(同一类)自己才知道的秘密
提示:访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
封装的具体实现
用private修饰,此时已经报错
那我们需要用到成员变量时要怎么办呢?
我们可以自己在类中创造方法来 获取和设定 成员变量(Java中已经给好了相应的方法)
get方法和set方法
我们可以通过get方法和set方法,去获取和设定 成员变量
class Student{
//成员属性
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//成员方法
public void eat(){
System.out.println(this.name + "在吃饭");
}
public void sleep(){
System.out.println(this.name + "在睡觉");
}
public void show(){
System.out.println("姓名 " + this.name + " 年龄 " + this.age);
}
}
//类的使用者
public class Blog {
public static void main(String[] args) {
//实例化一个对象
Student student = new Student();
//调用set get方法
student.setName("小罗");
student.setAge(10);
System.out.println(student.getName());
System.out.println(student.getAge());
student.eat();
student.sleep();
student.show();
}
}
2. static关键字
我们借用前面所用的学生类,来谈论static
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
static修饰成员变量
static 修饰的成员变量,称为静态成员变量 ,静态成员变量最大的特性: 不属于某个具体的对象,是所有对象所共 享的 。
class Student{
//成员属性
public String name;
public int age;
public String classroom;
public Student(String name, int age, String classroom) {
this.name = name;
this.age = age;
this.classroom = classroom;
}
}
//类的使用者
public class Blog {
public static void main(String[] args) {
//实例对象
Student student = new Student("小罗",10,"1班");
Student student1 = new Student("小泽",9,"1班");
Student student2 = new Student("小美",12,"1班");
}
}
以下是在调试过程中,初始化后 对象引用的属性
因为大家都在一个班级,都是大家共有的属性,没有必要仍然给每个人去赋值,这时我们尝试去给classroom去加static
public static String classroom = "1班";
在调试过程中 班级这个信息已经没有了
因为classroom加上static之后,classroom这个属性已经变成了Student类的静态成员变量,意思是每创建一个Student类的对象都会自带classroom
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问3. 类变量存储在方法区当中4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
静态成员变量不依赖于对象
static修饰成员变量的访问
类名.静态成员变量
System.out.println(Student.classroom);
Student.classroom = "2班";
System.out.println(Student.classroom);
static修饰成员方法
Java 中, 被 static 修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的 。静态成员一般是通过静态方法来访问的。
原理和static修饰的成员变量相似
class Student{
//成员属性
public String name;
public int age;
public static String classroom = "1班";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static String getClassroom(){
return classroom;
}
}
//类的使用者
public class Blog {
public static void main(String[] args) {
//实例化对象
Student student = new Student("小罗",10);
//调用静态方法
System.out.println(Student.getClassroom());
}
}
static修饰成员方法的访问
类名. 静态成员方法
class Student{
//成员属性
public String name;
public int age;
public static String classroom = "1班";
//直接初始化静态变量
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static String getClassroom(){
return classroom;
}
}
//类的使用者
public class Blog {
public static void main(String[] args) {
//实例化对象
Student student = new Student("小罗",10);
//调用静态方法
System.out.println(Student.getClassroom());
}
}
【 静态方法特性 】1. 不属于某个具体的对象,是类方法2. 可以通过对象调用,也可以通过类名 . 静态方法名 (...) 方式调用,更推荐使用后者3. 不能在静态方法中访问任何非静态成员变量4. 静态方法中不能调用任何非静态方法,因为非静态方法有 this 参数,在静态方法中调用时候无法传递 this 引用 (因为this的调用需要对象,而静态成员方法和静态成员变量都不需要对象引用)
3. 代码块
代码块概念以及分类
使用 {} 定义的一段代码称为代码块 。根据代码块定义的位置以及关键字,又可分为以下四种:
- 普通代码块
- 构造块
- 静态块
- 同步代码块(后面线程再说)
普通代码块
普通代码块:定义在方法中的代码块
public class Test {
public static void main(String[] args) {
//普通代码块
{
int a = 10;
System.out.println(a);
}
}
}
实例代码块
构造块:定义在类中(方法之外)的代码块(不加修饰符)。也叫:实例代码块。
构造代码块一般用于初始化实例成员变量
class Person{
public String name;
public int age;
// public static String sex;
//实例代码块
{
this.name = "小罗";
this.age = 10;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
class Person{
public String name;
public int age;
public static String sex;
//静态代码块
static {
sex = "male";
}
//实例代码块
{
this.name = "小罗";
this.age = 10;
}
}
注意事项
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
- 实例代码块只有在创建对象时才会执行