Java——面向对象(二)

目录

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. 访问权限修饰符


1. 对象与引用

1.1 对象

以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所指向的对象。两根绳系的是同一只汽球。

Java——面向对象(二)_第1张图片

1.2 值传递和引用传递

注:严格来说传递只有值传递一种

1.2.1 值传递(基本类型)

方法调用时,实际参数把它的值传递给 对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是 两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

1.2.2 引用传递(引用类型)

传地址。方法调用时,实 际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形 式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下 来,所以方法执行中形式参数的改变将会影响实际参数
 

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 = "李四";
    }
}

2. this关键字

格式: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);
      }
}

3. static关键字(静态)

概念: 可用来修饰属性、方法、代码块、内部类。

  • 类变量,和类一样只有一份。
  • 被static修饰的内容,随着类的加载而加载。
  • 优于对象存在
  • 被所有对象共享,可以通过类名直接调用
//常量,共有属性一般修饰为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(); //静态方法,静态变量建议使用类名调用
    }
}
  1.  静态方法不能使用非静态的成员变量,静态资源随着类先加载,非静态的随着对象的创建而加载。
  2. 非静态的随着对象的创建而加载。
  3. 非静态方法可以使用静态变量,非静态方法必须通过对象来调用,对象创建之前先加载类。

4. 代码块

概念:类似一个没有名字的方法。

分类:实例代码块和静态代码块。

4.1 实例代码块

{

  // java的任何合法代码

}

创建对象后执行。

在创建对象后执行,调用构造方法之前执行,每创建一次对象,执行一次。

4.2 静态代码块

static{

// java的任何合法代码

}

在类加载时候执行(只执行一次),多个静态按先后顺序执行。(与是否创建对象无关)

4.3 类什么时候加载

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——面向对象(二)_第2张图片

5. 包(package)

定义:为了更好地组织类,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);

6. 访问权限修饰符

定义:用来修饰类、成员方法、成员变量、内部类、控制对其访问的权限

访问权限和包是密切相关的。

 public(公共的)     类、成员变量、方法、内部类。   

在任何类中都可以访问

 protected(保护的)   成员变量、方法、内部类   

在不同包的子类中,可以访问protected

  (default)(默认的 无)   类、成员变量、方法、内部类

只能被同包的类访问

  private(私人的)       成员变量、方法、内部类

私有权限只能在自己类中访问,同包的其他类也不能访问;

在同包的其他类中,只能访问public、protected、default。

public protected default private
同类       √        √       √       √
同包       √        √       √
不同包子类       √        √    
不同包不同类       √      

你可能感兴趣的:(java,开发语言,后端,面向对象编程)