JAVA面向对象之对象创建过程、数据传递、访问控制符

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

文章目录

对象创建过程

有两个类 A 和 B。B继承自A

class A {
    int v1 = 1;
    static int v2 = 2;

    static {
    }

    public A() {
    }
}
复制代码
class B extends A {
    int v3 = 3;
    static int v4 = 4;

    static {
    }

    public B() {
    }
}
复制代码

创建B实例

B b = new B();
复制代码

对象创建过程如下
1、加载父类(A),为父类静态变量分配内存(v2分配内存,但未执行赋值运算,默认值是0)
2、加载子类(B),为子类静态变量分配内存(v4分配内存,但未执行赋值运算,默认值是0)
3、执行父类静态变量赋值运算和静态初始化块(v2赋值和初始化块,按代码先后顺序执行)
4、执行子类静态变量赋值运算和静态初始化块(v4赋值和初始化块,按代码先后顺序执行)
5、创建父类对象,为父类非静态变量分配内存(v1)
6、创建子类对象,为子类非静态变量分配内存(v3)
7、执行父类非静态变量赋值运算
8、执行父类构造方法
9、执行子类非静态变量赋值运算
10、执行子类构造方法

程序验证:

class A {
    int v1 = 1;
    static int v2 = 2;

    static {
        System.out.println("A静态初始化块");
    }

    public A() {
        System.out.println("A构造方法");
    }
}
复制代码
class B extends A {
    int v3 = 3;
    static int v4 = 4;

    static {
        System.out.println("B静态初始化块");
    }

    public B() {
        System.out.println("B构造方法");
    }
}
复制代码
public class Main {
    public static void main(String[] args) {
        new B();
    }
}
复制代码

运行程序:
在这里插入图片描述

java的数据传递

java 数据类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)
在这里插入图片描述
基本数据类型的数据传递,传递的是值本身。引用类型的值传递,传递的是内存地址。看下边的例子:

基本类型
变量 a = 10,我们将变量 a 传入 f() 方法中重新赋值 100,然后将 a 输出,结果是之前的 10

public class Main {
    public static void main(String[] args) {
        int a = 10;
        f(a);
        System.out.println(a);//输出10
    }

    private static void f(int a) {
        a = 100;
    }
}
复制代码

引用类型
我们用到了之前的 Point 类

public class Point {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    ......
}
复制代码

创建一个 Point 类的对象 a,同时赋值 a.x = 3,a.y = 4
然后将 a 传入 f() 方法重新赋值 a.x = 30,a.y = 40
输出 a.x 和 a.y的值,发现是赋值后的值

public class Test {
	public static void main(String[] args){
		Point a = new Point(3,4);
		f(a);
		System.out.println(a.x);//30
		System.out.println(a.y);//40
	}

	private static void f(Point a) {
		a.x = 30;
		a.y = 40;
	}
	
}
复制代码

访问控制符

Java 提供了 4 种访问控制符,主要用于控制其他类是否可以访问某一类中的属性或方法,从而实现数据封装。按权限大小分为:

public > protected > friendly > private

选择原则:尽量缩小访问范围

修饰符 本类 同一个包中的类 子类 其他类
public 可以访问 可以访问 可以访问 可以访问
protected 可以访问 可以访问 可以访问 不能访问
默认 可以访问 可以访问 不能访问 不能访问
private 可以访问 不能访问 不能访问 不能访问

下面分别介绍:
private(当前类访问权限) :如果类里的一个成员(包括成员变量、方法、构造器等)使用 private 修饰,则这个成员只能在当前类的内部被访问。很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在该类的内部,如果外界访问。可以提供类似getter\setter的方法访问被 private 修饰的成员变量。可以看下面例子

Student

public class Student {
    private int id;
    private String name;
    private String gender;
    private int age;

    public Student() {

    }

    public Student(int id, String name, String gender, int age) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
复制代码

Main.java

public class Main {
    public static void main(String[] args) {
        Student s = new Student();
        s.setId(9527);
        s.setName("小A");
        s.setGender("男");
        s.setAge(11);

        System.out.println(s.getId());
        System.out.println(s.getName());
        System.out.println(s.getGender());
        System.out.println(s.getAge());
    }
}
复制代码

运行程序:
在这里插入图片描述
default(包 访问权限) :如果一个成员(包括 成员变量、方法、构造器等)或者一个外部类不适用任何访问控制符修饰,就称它为包访问权限的,default访问控制的成员或者外部类可以被相同包下的其他类访问。

protected(子类访问权限) :如果一个成员(包括成员变量、方法、构造器等)使用protected访问控制修饰,那么这个成员可以被同一个包中其他类访问。也可以被不同的包中的子类访问。在通常情况下,如果使用protected来修饰一个方法时,通常希望子类来重写这个方法。

public(公共访问权限) :这是一个最宽松的访问权限级别,如果一个成员(包括成员变量、方法、构造器等)或者一个外部类使用public访问控制来修饰,那么这个成员或者外部类就可以被所有的类访问,不管访问类和被访问类是否处于同一个包中。是否具有父子关系。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享