方法中参数传递的机制
参数的传递都是「值传递」,在调用方法的时候,参数会被创造出一个副本,原本的值是不会改变的。
基本数据类型,也称为「值类型」。
下面是手打的今天上课关于传递的代码
package com;
public class Demo11 {
void fun1(int i, int j) {
i = i + 5;
j = j + 5;
System.out.println("fun1-i:" + i);
System.out.println("fun1-j:" + j);
}
void fun1(P p) {
p.i = p.i + 5;
p.j = p.j + 5;
System.out.println("fun1-p-i:" + p.i);
System.out.println("fun1-p-j:" + p.j);
}
public static void main(String[] args) {
Demo11 demo11 = new Demo11();
int i = 10;
int j = 20;
demo11.fun1(i, j);
System.out.println("main-i:" + i);
System.out.println("main-j:" + j);
System.out.println("====================");
P p = new P();
p.i = 10;
p.j = 20;
demo11.fun1(p);
System.out.println("main-p-i:" + p.i);
System.out.println("main-p-j:" + p.j);
}
}
class P {
int i;
int j;
}
总结一下:如果方法中传入的是基本数据类型,那么原变量的值是不会发生改变的,如果方法中传入的是引用数据类型(即
类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。
变量
根据变量定义所在位置的不同,可以定义:
- 成员变量:在类中定义的变量,用 static 修饰的为类变量,非 static 修饰的为实例变量。
访问变量的语法:
类.成员变量
实例(对象).成员变量
public class Demo1 {
int x; // 实例变量
static double PI = 3.14;
public static void main(String[] args) {
Demo1 d1 = new Demo1(); // d1 成为实例或者对象
d1.x = 10;
System.out.println(d1.PI); // 不建议这样使用
System.out.println(Demo1.PI); // PI为类变量
}
}
封装和隐藏
隐藏和封装
封装
封装是面向对象编程的三大特性之一。
封装的目的:
- 隐藏类方法实现的细节;
- 让使用者只能通过预先定义的方法来访问数据,从而可以在方法中加入一些控制逻辑,限制对成员变量的不合理访问。
简单的理解就是,把成员变量隐藏起来,暴露方法来提供成员的修改和访问
public class Student {
private String name;
private int age;
private boolean sex;
public Student(String name, int age, boolean sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name + (this.sex ? "先生" : "女士");
}
}
Getter 和 Setter
把属性定义为 private 类型,即私有,向外部暴露其 get 和 set 方法。
相关方法名的定义:
- get + 首字母大写的属性名() :get 方法一般都是具有和属性数据类型一致的返回值,并且是没有形参的。
- set + 首字母大写的属性名(参数):set 方法一般都是具有和属性数据类型一致的方法参数,返回值一般是 void。
在 Eclipse 中,可以通过快捷方式生成相关属性的 getter 和 setter
在 「source」-> 「generate getters and setters」
package 和 import
为了便于类文件的管理,Java 中引入了包的概念 package,类的唯一性是要带包名的。
包名的命名规范:
第一层是企业的域名的反写
例如:com.ntqingniao
第二层是企业项目的名称
例如:com.ntqingniao.j96
、com.ntqingniao.crm
第三层是企业项目模块的名称
例如:com.ntqingniao.j96.oop
、com.ntqingniao.crm.base
在 Eclipse 中 「new-package」方式建包
类定义包的语法
// 在类文件的第一行
package com.ntqingniao.j96.oop;
在不同的包中,是可以定义相同类名的类的。因为一个类的唯一性是包含包名的,比如
com.ntqingniao.j96.oop.Demo1
叫做类的全名。
在实际的企业开发中,是不允许出现没有包的类。
使用包
使用 import 关键字将本类要使用的其他包中的类进行引入。
但是,import 不是必须的,我们可以使用类全名的方式进行类的使用。一般不建议,太麻烦。
使用 ALT+/
可以单个引入,也可以使用 CTRL+SHIFT+O
全部引入。
如果要引入某个包下面的所有类,可以使用通配符 *
,例如,引入com.ntqingniao.j96.oop.*
,但是要注意通配符只能出现在最后。
对于 java.lang 包中的类,系统会自动的默认引入,不需要使用 import。
自学部分:静态引入 import static,用的较少
访问控制修饰符
访问控制修饰符能修饰的对象包括:成员变量、方法、构造器
访问控制修饰符,就是控制修饰的对象可以在什么样的范围(包)内被访问。
private | default | protected | public | |
---|---|---|---|---|
同一个类 | √ | √ | √ | √ |
同一个包 | √ | √ | √ | |
子类 | √ | √ | ||
全局范围 | √ |
- private:只能在当前类中被访问,一般用于对成员变量的修饰;
- default:没有定义修饰符就是 default;
- protected:可以在子类和本包中被访问,外部包不能被访问,在有一定业务意义的包中,可以定义类中成员变量是protected;
- public:一般定义在方法或者一些常量中,用于外部接口的访问。
在实际的开发中,大部分的场景使用 private 定义属性,public 定义方法。
JDK 中比较重要的包