这是我参与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访问控制来修饰,那么这个成员或者外部类就可以被所有的类访问,不管访问类和被访问类是否处于同一个包中。是否具有父子关系。