类和对象下
封装
封装的概念
面对对象程序三大特性:封装,继承,多态,在类和对象阶段,我们主要研究的就是封装.那什么是封装,简单来说,就是套壳屏蔽细节.
封装:将数据与操作数据的方法有机结合,屏蔽对象的属性和所实现需要的细节仅对外公开接口与对象实现交互.
访问限定符
Java中主要通过类和访问权限实现封装:类可以将数据和封装数据结合在一起,访问权限用来控制方法或者字段能否在类外使用.Java中有四种访问限定符:
比如:
public:可以理解为一个人的外貌特征,都可以看得到.
default:对于家人不是秘密都可以知道,(一个包里面),对于其他人就是隐私.
private:只有自己知道,别人都不知道.
说明:
- protected主要用在继承
- default权限指什么都不写的默认权限
- 访问权限可以控制类成员可见性,还可以控制类的可见性
- 一般成员变量设置为private,成员方法为public
static成员
static修饰成员变量
static修饰的成员变量称为静态成员变量.它不属于哪一个具体的对象,是所有对象共享的.
静态成员变量特征:
- 不属于某一个具体的对象,是类的属性,所有对象共享,不储存在哪一个对象空间里面.
- 可以通过对象访问,也可以通过类名,推荐使用类名访问,
- 类变量储存在方法区
- 生命周期随类加载创建,卸载销毁
public class Student {
public String name;
public String gender;
public int age;
public static String classRoom = "666";
public Student(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
// ...
public static void main(String[] args) {
// 静态成员变量可以直接通过类名访问
System.out.println(Student.classRoom);
Student s1 = new Student("Li leilei", "男", 18);
// 也可以通过对象访问:但是classRoom是对象共享的
System.out.println(s1.classRoom);
}
}
static修饰成员方法
一般类中成员都为private,成员方法为public,那Student类中clasRoom属性如何在类外访问
那我们该如何去访问static修饰的成员,被static修饰的成员方法是静态方法,是类的方法,不是一个对象特有的,静态成员通过静态方法访问:
静态方法特性
- 不属于哪具体的对象,是类方法
- 可以通过对象调用,也可以类名.静态方法名,推荐后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,非静态方法含有this参数,静态方法中调用无法传递this引用
static成员变量初始化
静态成员变量初始化有两种:就地初始化,静态代码块初始化.
- 就地初始化:在定义是定义时直接给出初始值.
- 静态代码块初始化:可是什么是代码块呢,我们接下来聊聊.
代码块
代码块概念和分类
使用{}定义的一段代码为代码块,根据代码块定义和位置,有以下四种:
普通代码块,构造块,静态块,同步代码块
###普通代码块
定义在方法中的代码块
public class Test {
public static void main(String[] args) {
{//定义在方法里面,不过较少见
int x = 10;
System.out.println("x = " + x);
}
}
}
构造代码块
定义在类中的代码块,即实例代码块.代码块的构造一般用于初始化实例成员变量
静态代码块:用static修饰的代码块,用于初始化静态成员变量.
class Student{
public String name;
public String gender;
public int age;
private static String clasRoom= "bit666";
//实例代码块
{
this.name = "张三";
this.age= 16;
this.gender = "女";
System.out.println("实例代码块");
}
//静态代码块
static {
clasRoom = "bit888";
System.out.println("静态代码块");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
public static String getClassmate() {
return clasRoom;
}
}
public class Test {
public static void main(String[] args) {
{
Student stu = new Student();
System.out.println(stu.toString());
}
}
}
注意
- 静态代码块不管生成多少对象,只会被执行一次
- 静态成员变量是类的属性,在JVM加载类时开辟空间并且初始化
- 一个类如果有多个静态代码块,在编译代码,编译器会按照先后顺序依次执行
- 实例代码块只有在创建对象才会执行
对象的打印
想要打印对象中属性该如何去处理?
答案:重写toString方法.
类如果有多个静态代码块,在编译代码,编译器会按照先后顺序依次执行
4. 实例代码块只有在创建对象才会执行
##对象的打印
想要打印对象中属性该如何去处理?
答案:重写toString方法.
[外链图片转存中…(img-hMhpSOH1-1691573381030)]
会打印: