面向对象2
文章目录
对象与引用
创建对象
Person zs = new Person("张三",22);
Person zs:在栈空间声明一个变量;
new Person(“张三”,22):在堆空间创建并存储的对象;
= :把对象在内存中的地址赋给左边的变量,左边的变量只是有对象的引用地址。
值传递与引用传递
值传递(形参类型为基本数据类型):实参把值传给形参,是两个不同的存储单元,故方法执行中形参值改变不影响实参的值。
public class Demo {
//基本类型值传递
public static void main(String[] args) {
Demo d = new Demo();
int a = 20;
d.test(a);
System.out.println(a);
}
//形参b,用实参a的值直接对b进行了赋值,在内存中有两个独立的存储空间 a,b
public void test(int b){
b = 10; //b的值发生改变,不会影响到a的值
}
}
引用传递(形参类型为引用数据类型):也称值传递,实参是对象,实参与形参指向同一个地址,故方法执行中形参的改变会影响实参的值。
public class Demo {
//引用类型 在传递时,传的是对象的地址
public static void main(String[] args) {
Demo d = new Demo();
Person zs = new Person("小红", 19);
d.test(zs);//只是把对象的地址传递给了p
System.out.println(zs.name);//输出为李四
}
public void test(Person p){ //p和zs指向的是同一个对象
p.name = "小明";
}
}
this关键字
声明格式:this.成员变量名
this表示当前操作的对象,在成员方法、构造方法中使用的变量,使用this调用;
用this关键字引用成员变量、成员方法;
用来区分成员变量和局部变量。
static关键字
static
用来修饰属性、方法、代码块、内部类;
被static修饰的内容随着类的加载而加载,优先于对象存在,被所有对象共享,可以通过类名直接调用(静态方法、静态变量建议使用类名调用);
类变量,和类一样只有一份;
常量一般修饰为static。
static修饰方法(类方法)
静态方法不能使用非静态的成员变量,静态资源随着类先加载,非静态资源随着对象的创建而加载;
非静态方法可以使用静态变量,非静态方法必须通过对象来调用,对象创建之前先加载类
静态变量和非静态变量的区别
(1)静态变量随着类的加载而加载,优先于对象存在,通过类名来调用;非静态变量必须通过对象来调用,对象创建之前先加载类。
(2)静态变量是全局变量,被所有对象共享;非静态变量是局部变量,不共享。
(3)静态方法不能使用非静态的成员变量;非静态方法可以使用静态的成员变量。
代码块
代码块:类似于一个没有名字的方法。
代码块分类
实例代码块:在创建对象后执行,调用构造方法之前,每创建对象一次,调用一次。
{
System.out.println("实例代码块");
}
静态代码块:静态代码块在类加载的时候执行,只执行一次,多个静态代码块按先后顺序。
static {
System.out.println("静态代码块");
}
类什么时候加载
main方法在哪个类中执行,这个类加载;
创建某个类的对象,这个类加载;
调用类中的静态属性、方法,这个类加载。
包
包的功能
为了更好地组织类,Java提供了包机制,区别于类名的命名空间(是类路径中的一部分 地址);
避免类重名;
按功能管理。
包的命名规则
包名都小写
第一级 项目类型:com(商业)、org(组织)、edu(教育)、gov(政府)
第二级 公司名称:oracle、sun、huawei
第三级 项目名称:oa、erp、cms
第四级 功能模块:窗口/视图层,数据访问层,服务层,工具类
细分子模块
包的导入(import关键字)
import java.util.Date;
import:导入包中的其他类
java.util.Date:类的全名
Date:简称
权限修饰符
权限修饰符的功能
用来修饰类、成员变量、成员方法、内部类,控制对其访问权限。
权限修饰符的分类
public:公共的,类、成员变量、方法、内部类,在任何类中都可以访问到
protected:保护的 ,成员变量、成员方法、内部类
default:默认的(无),类、成员变量、方法、内部类
private:私有的,成员变量、方法、内部类,在本类中可以访问到。
在同包的其他类中只能访问公共的、受保护的、默认的;
私有权限只能在自己类中访问,同包其它类也不能访问;
不同包不同类公共的仍然可以访问,受保护的、默认的不能访问;
在不同包的子类中可以访问父类受保护成员。