Java封装、构造方法、static关键字
程序员文章站
2022-06-22 14:23:33
1.封装封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想。封装的好处:隐藏实现细节,方便使用者使用安全,可以控制可见范围封装通过权限修饰符来实现:修饰符本类本包其他包的子类任意位置private√×××缺省√√××protected√√√×public√√√√权限修饰符可以修饰:类(外部类):public 和缺省属性:4种方法:4种构...
1.封装
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想。
封装的好处:
- 隐藏实现细节,方便使用者使用
- 安全,可以控制可见范围
封装通过权限修饰符来实现:
修饰符 | 本类 | 本包 | 其他包的子类 | 任意位置 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
权限修饰符可以修饰:
- 类(外部类):public 和缺省
- 属性:4种
- 方法:4种
- 构造方法:4种
属性的封装:
(1)属性私有化(private)
(2)提供公共的(public)的getter/setter方法
2.构造方法
构造方法,也称构造器,是类的成员之一。
格式:
【修饰符】 class 类名{
【修饰符】 类名(){//无参构造
}
【修饰符】 类名(形参列表){//有参构造
}
}
例:
class Test{
int a;
public Test(){
}
public Test(int a){
this.a=a;
}
}
构造方法作用:
- 与new一起使用创建对象
- 为对象属性进行初始化
构造方法的特点
- 所有类都有构造方法
- 构造方法的名称必须与类名相同
- 如果一个类没有显示给出构造方法,那么系统会默认有一个无参构造
- 如果一个类显式/明确的声明了构造器,那么系统将不再自动添加默认的无参构造,如果需要,那么就需要手动添加
- 构造方法可以重载
- 构造方法没有返回值类型(void也不写,可以写return;)
3.static关键字
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。所以需要用到static。
static:静态的,可以修饰方法,属性,代码块,内部类。
static修饰成员变量:一般称为静态变量或类变量
- 静态变量的值是该类所有对象共享的
- 静态变量存储在方法区
- 静态变量对应的get/set方法也是静态的
- 静态变量随着类的初始化而初始化,优先于实例对象的创建
- 访问权限允许时,可不创建对象,直接 类名.变量 调用
static修饰成员方法:类方法或静态方法
- static修饰的方法,当访问权限允许,可以通过"类名.方法"访问
- static修饰的方法不能被重写,因为静态方法是类方法,是属于类的,和对象无关
- static方法内部不能有this和super.
- 若静态方法中有局部变量与类变量重名,可以使用“本类名.xxx”
- 若静态方法中想要访问父类的静态成员,可以使用“父类名.xxx”
- static方法内部不能访问非静态的属性和方法。
static修饰代码块:静态代码块
3.1构造代码块
也叫非静态代码块
语法格式:
【修饰符】 class 类名{
{
构造代码块
}
}
构造代码块:
- 在创建的过程中,为对象属性赋值,协助完成实例初始化的过程
- 每次创建对象时都会执行
- 优先于构造器执行
- 创建子类对象时,需要先为从父类继承的属性进行初始化,所以会导致父类的构造块和构造器先执行
3.2静态代码块
语法格式:
【修饰符】 class 类名{
static{
静态代码块;
}
}
静态代码块:
- 协助完成类初始化,可以为类变量赋值。
- 随着类的初始化而初始化,只执行一次
- 如果子类初始化时,它的父类没有初始化会先初始化父类
- 在静态代码块中不能访问非静态成员(属性、方法、内部类)
- 在静态代码块中不能使用this和super关键字
- 如果有重名问题,需要访问本类或父类的静态成员,那么可以使用“本类名.xx”、“父类名.xx”。
3.3静态与非静态的访问原则
(1)同一个类中:
- 静态成员中不能访问非静态的成员
- 非静态成员中可以访问静态成员
(2)不同类中:
- 访问其他类的非静态成员必须使用“对象.非静态成员”的格式
- 访问其他类的静态成员建议使用“类名.静态成员”**的格式,也可以使用“对象.静态成员”
3.4初始化顺序
- 编译器会把“类变量的显式初始化”、“静态代码块”的内容按顺序合并为一个的类初始化方法。所以类的初始化过程就是执行方法,即类变量的显式初始化与静态代码块一定是一起执行的,而且因为类初始化只要一次,因此只有一个,且只会执行一次。
- 执行子类的方法时,如果父类也没有初始化,会先执行父类的方法。
- 编译器会把“非静态变量的显示初始化”、“非静态代码块”的内容按顺序合并到每一个构造器中,构成一个个的实例初始化方法,有几个构造器,就有几个方法。而且“非静态变量的显示初始化”、“非静态代码块”的内容在上面,原来构造器中的代码在下面。因此对象的初始化,即执行它的方法,即非静态变量的显示初始化、非静态代码块和构造器中的代码是一起执行的,而且非静态变量的显示初始化、非静态代码块的内容先于构造器的代码执行。
- 执行子类的方法时,一定会先调用父类的方法,因为要先为从父类继承的属性先完成初始化。(super([实参列表]))
- 不管是类变量还是实例变量都有默认值,再用或初始化之前,就有默认值。
示例代码:
class Ba{
private String str = assign();
{
System.out.println("(1)父类的非静态代码块");
}
public Ba(){
System.out.println("(2)父类的无参构造");
}
public String assign(){
System.out.println("(3)父类的assign()");
return "ba";
}
}
class Er extends Ba{
private String str = assign();
{
System.out.println("(4)子类的非静态代码块");
}
public Er(){
//super() ==>调用父类的实例初始化方法,而且它在子类实例初始化方法的首行
System.out.println("(5)子类的无参构造");
}
public String assign(){
System.out.println("(6)子类的assign()");
return "er";
}
}
class Test{
public static void main(String[] args){
new Er();//612645
}
}
图解:
本文地址:https://blog.csdn.net/m0_46988935/article/details/110198297