目录
1. 对象与引用
1.1 对象
1.2 值传递和引用传递
1.2.1 值传递(基本类型)
1.2.2 引用传递(引用类型)
2. this关键字
3. static关键字(静态)
4. 代码块
4.1 实例代码块
4.2 静态代码块
4.3 类什么时候加载
5. 包(package)
6. 访问权限修饰符
以Car类为例:
Car bm = new Car();
new Car() : 以Car类做为模板,调用Car类的构造函数,在堆空间里创建一个Car类对象
Car bm: 创建了一个Car类的引用变量,
= : 使对象引用指向刚创建的那个Car对象
Car bm; bm= new Car();
有两个实体:一是对象引用变量,一是对象本身。
对象好比是一只很大的气球,但是我们抓不住它。
引用变量是一根绳,可以用来系汽球。
Car car1; (1)创建一根绳子,一根还没有系上任何一个汽球的绳;
Car car2; (2)就又做了一根绳,还没系上汽球,
car1 = new Car(); (3)给car1 系上气球;
car2 = car1 ; (4)这里,发生了复制行为。
要说明的是,对象本身并没有被复制,被复制的只是对象引用。
结果是,car2也指向了car1所指向的对象。两根绳系的是同一只汽球。
注:严格来说传递只有值传递一种
方法调用时,实际参数把它的值传递给 对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是 两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
传地址。方法调用时,实 际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形 式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下 来,所以方法执行中形式参数的改变将会影响实际参数
public class Demo {
//引用类型 在传递时,传的是对象的地址
public static void main(String[] args) {
Demo d = new Demo();
Person zs = new Person("张三", 20);
d.test(zs);
//只是把对象的地址传递给了 p
System.out.println(zs.name);//李四
}
//p和zs指向的是同一个对象
public void test(Person p){
p.name = "李四";
}
}
格式:this.成员变量名
表示正在操作的对象,在成员方法,构造方法中使用成员变量,使用this调用
在一个类的方法或构造方法,可以使用“this.成员变量名”这样的 格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
public class Person {
//成员变量
public String name;
int age;
//构造方法
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
//成员方法 哪个对象调用show方法,那么name,age就是哪个对象中的属性
//this 表示当前正在操作的对象 在成员方法,构造方法中使用成员变量,使用this调用.
public void show(){
System.out.println("姓名:"+this.name+" 年龄:"+this.age);
}
}
概念: 可用来修饰属性、方法、代码块、内部类。
//常量,共有属性一般修饰为static
public class Person {
String name; //name属性不建议修饰为static,在内存中只有一份,而name每个对象都不一样。
int age;
static String country = "China";
public void show(){
this.name = name;
this.age = age; //非静态方法可以使用静态变量,且非静态方法必须通过
//对象来对调用,对象加载之前先加载类。
System.out.println(country);
}
//静态方法不能使用非静态的成员变量,静态资源随着类先加载,非静态的随着对象的创建而加载
public static void test(){
// System.out.println(name); 错误,static修饰的内容会随着类的加载而加载,
//静态方法不能直接调用非静态的成员变量
country = "English";
System.out.println(country);
}
public static void main(String[] args) {
Person ps1 = new Person();
ps1.name = "张三";
ps1.age = 20;
ps1.show();
Person ps2 = new Person();
ps2.name = "李四";
ps2.age = 21;
Person.country = "中国";
ps2.show();
Person.test(); //静态方法,静态变量建议使用类名调用
}
}
概念:类似一个没有名字的方法。
分类:实例代码块和静态代码块。
{
// java的任何合法代码
}
创建对象后执行。
在创建对象后执行,调用构造方法之前执行,每创建一次对象,执行一次。
static{
// java的任何合法代码
}
在类加载时候执行(只执行一次),多个静态按先后顺序执行。(与是否创建对象无关)
main方法在那个类中执行,这个类就加载,创建某个类的对象,调用某个类中的静态属性,方法。
public class DaiMaK {
static int age = 20;
public DaiMaK(){
System.out.println("无参的构造方法");
}
String name;
{
System.out.println("实例代码块");
}
static{
System.out.println("静态代码块1");
}
static{
System.out.println("静态代码块2");
}
public void show(){
System.out.println("成员方法");
}
public static void Person(){
System.out.println("静态的成员变量");
}
public static void main(String[] args) {
new DaiMaK();
new DaiMaK();
new DaiMaK().show();
DaiMaK.Person();
}
结果:
定义:为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。
注:是类路径中的一部分地址
作用:
1. 避免类重名
2. 按功能管理分类
第一级 | 项目名称 | com(商业)、org(组织)、edu(教育)、gov(政府) |
第二级 | 公司名称 | sun,huawei等 |
第三级 | 项目名称 | bcms,oa,erp,cms等 |
第四级 | 功能模块 | 窗口/视图层、数据访问层、服务层、工具类、细分子模块 |
3. 控制访问权限
注:使用import导入其他包中的类
java.unit.Date 类的全类名 Date 简称
同一类名简称只能导入一次
例:new Date();
new java.sql.Date(1000);
定义:用来修饰类、成员方法、成员变量、内部类、控制对其访问的权限
访问权限和包是密切相关的。
public(公共的) 类、成员变量、方法、内部类。
在任何类中都可以访问
protected(保护的) 成员变量、方法、内部类
在不同包的子类中,可以访问protected
(default)(默认的 无) 类、成员变量、方法、内部类
只能被同包的类访问
private(私人的) 成员变量、方法、内部类
私有权限只能在自己类中访问,同包的其他类也不能访问;
在同包的其他类中,只能访问public、protected、default。
public | protected | default | private | |
同类 | √ | √ | √ | √ |
同包 | √ | √ | √ | |
不同包子类 | √ | √ | ||
不同包不同类 | √ |