面向对象(2)
对象与引用
java语言中除基本类型之外的变量都称之为引用类型
java中的对象时通过引用对其操作的
Car bm = new Car();
-
右边的new Car是以Car类为模板,调用无参构造函数,在堆空间中创建一个Car对象
-
左边的Car bm 在栈中创建了一个Car类型的引用变量,所谓Car的引用变量,就是指向右边对象的对象引用
-
= 把对象在内存中的地址 赋给 左边的变量 左边的变量拿的只是对象的引用地址
public Person(String name,int age){ this.name=name; this.age=age; }
this关键字
this表示当前正在操作的对象,在成员方法,构造方法中使用成员变量,使用this调用
this代表当前对象
this可以引用成员变量
this可以引用成员方法
public void showInfo(){ System.out.println("姓名:"+this.name+" 年龄:"+this.age); }
哪个对象调用showInfo方法,那么 name,age就是那个方法中的属性
值传递
public class Demo {
/*
基本类型值传递
*/
public static void main(String[] args) {
Demo d = new Demo();
int a = 10;
d.test(a);
System.out.println(a);
}
/*
形参b
用实参a的值,直接对b进行了赋值,在内存中有两个独立的存储空间 a,b
*/
public void test(int b){
b = 20; //b的值发生改变 不会影响到a
}
}
形参的改变,不会影响实参的值,形参只是用实参的值初始化自己的存储单元内容,在内存中有两个独立的存储空间
引用传递(传地址)
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);//李四
}
/*
*/
public void test(Person p){ //p和zs指向的是同一个对象
p.name = "李四";
}
}
引用类型在传递的时候,传的是对象的地址,所以此时,形参和实参指向的是同一个对象,对形参进行操作那么也就是对实参操作
static关键字
static 静态修饰属性、方法、代码块、内部类
类变量,和类一样 只有一份
-
被static修饰的内容 随着类的加载而加载
-
优先于对象存在
-
被所有对象共享
-
可以通过类名直接调用
static String country = "中国"; //常量一般修饰为static
static修饰方法,类方法,静态方法不能使用非静态的成员变量,静态资源随着类先加载
非静态的成员变量随着对象的创建而加载
非静态方法可以使用静态变量,非静态方法必须通过对象来调用,对象创建前会先加载类
/*
static修饰方法,类方法,静态方法不能使用非静态的成员变量,静态资源随着类先加载,
非静态的随着对象的创建而加载
*/
public static void test(){
//System.out.println(name);// 会报错
}
/*
非静态方法可以使用静态变量, 非静态方法必须通过对象来调用,对象创建之前先加载类
*/
public void test1(){
System.out.println(country);
}
代码块
类似一个没有名字的方法
代码块分为:
实例代码块:在创建对象之后执行,调用构造方法之前执行,每创建一次对象就执行一次
静态代码块:在类加载时执行,只执行一次,多个静态按照先后顺序执行
类什么时候加载?
main方法在哪个类中执行,这个类加载
创建某个类的对象
调用某个类中静态属性、方法
包
为了更好的组织类,java提供了包机制,用于区别类名的命名空间(是类路径中的一部分 地址)
避免类重名
按功能管理类
包名都小写
控制访问权限
访问权限修饰符
用来修饰类、成员变量、成员方法、内部类,控制对齐访问的权限
访问权限和包密切相关
public:公共的 类、成员变量、方法、内部类 可以任意被访问
protect:保护的 成员方法、变量、内部类 同包下、不同包的子类可以访问
default:默认的 类、成员变量、方法、内部类 同包下可以访问
private:私有的 本类中访问