day10_this丶package 丶import

this关键字

this是什么? this理解为:当前对象 或 当前正在创建的对象。

特点

  • this 是 java 语言中的一个关键字,它存储在 Java 虚拟机堆内存的对象内部
  • this 可以看做一个变量,它是一个引用,this 这个引用保存了当前对象的内存地址指向自身
  • 任何一个堆内存的 java 对象都有一个 this,也就是 说创建 100 个 java 对象则分别对应 100 个 this。
  • this可以用来修饰、调用:属性、方法、构造器
  • this 可以使用在实例方法中以及 构造方法中,this 不能出现在带有 static 的方法当中。

this 可以调用类的属性、方法

  • 在类的成员方法中:我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。
  • 在类的构造器中:我们可以使用"this.属性"或"this.方法"的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。

代码示例

/*
    this:
        1、this是一个关键字,全部小写。
        2、this是什么,在内存方面是怎样的?
            一个对象一个this。
            this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身。
            所以,严格意义上来说,this代表的就是“当前对象”
            this存储在堆内存当中对象的内部。

        3、this只能使用在实例方法中。谁调用这个实例方法,this就是谁。
        所以this代表的是:当前对象。

        4、“this.”大部分情况下是可以省略的。

        5、为什么this不能使用在静态方法中??????
            this代表当前对象,静态方法中不存在当前对象。
*/
public class ThisTest01{
    public static void main(String[] args){

        Customer c1 = new Customer("张三");
        c1.shopping();

        Customer c2 = new Customer("李四");
        c2.shopping();

        Customer.doSome();
    }
}

// 顾客类
class Customer{

    // 属性
    // 实例变量(必须采用“引用.”的方式访问)
    String name;   

    //构造方法
    public Customer(){
    
    }
    public Customer(String s){
        name = s;
    }

    // 顾客购物的方法
    // 实例方法
    public void shopping(){
        // 这里的this是谁?this是当前对象。
        // c1调用shopping(),this是c1
        // c2调用shopping(),this是c2
        //System.out.println(this.name + "正在购物!");

        // this. 是可以省略的。
        // this. 省略的话,还是默认访问“当前对象”的name。
        System.out.println(name + "正在购物!");
    }

    // 静态方法
    public static void doSome(){
        // this代表的是当前对象,而静态方法的调用不需要对象。矛盾了。
        // 错误: 无法从静态上下文中引用非静态 变量 this
        //System.out.println(this);
    }
}


class Student{

    // 实例变量,怎么访问?必须先new对象,通过“引用.”来访问。
    String name = "zhangsan";

    // 静态方法
    public static void m1(){
        //System.out.println(name);

        // this代表的是当前对象。
        //System.out.println(this.name);

        // 除非你这样
        Student s = new Student();
        System.out.println(s.name);

    }

    //为什么set和get方法是实例方法?
    public static void setName(String s){
        name = s;
    }
    public String getName(){
        return name;
    }

    // 什么时候方法定义为实例方法,什么时候定义为静态方法?
    // 如果方法中直接访问了实例变量,该方法必须是实例方法。
}

this调用构造器

  • 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
  • 构造器中不能通过"this(形参列表)"方式调用自己
  • 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
  • 规定:"this(形参列表)"必须声明在当前构造器的首行
  • 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器
package demo03;
/*
    1、this除了可以使用在实例方法中,还可以用在构造方法中。
    2、新语法:通过当前的构造方法去调用另一个本类的构造方法,可以使用以下语法格式:
        this(实际参数列表);
            通过一个构造方法1去调用构造方法2,可以做到代码复用。
            但需要注意的是:“构造方法1”和“构造方法2” 都是在同一个类当中。

    3、this() 这个语法作用是什么?
        代码复用。

    4、死记硬背:
        对于this()的调用只能出现在构造方法的第一行。
*/
class Person{ // 定义Person类
    private String name ;
    private int age ;
    public Person(){ // 无参构造器
        System.out.println("新对象实例化") ;
    }
    public Person(String name){
        this(); // 调用本类中的无参构造器
        this.name = name ;
    }
    public Person(String name,int age){
        this(name) ; // 调用有一个参数的构造器
        this.age = age;
    }
    public String getInfo(){
        return "姓名:" + name + ",年龄:" + age ;
    }
}

对象创建的过程和this的本质

构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步:

  1. 分配对象空间,并将对象成员变量初始化为0或空
  2. 执行属性值的显示初始化
  3. 执行构造方法
  4. 返回对象的地址给相关的变量

this的本质就是“创建好的对象的地址”!  由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

关键字:package 

package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:

  • package 顶层包名.子包名 ; 
package pack1.pack2; //指定类PackageTest属于包pack1.pack2
  • 包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次;
  • 包通常用小写单词标识。通常使用所在公司域名的倒置:com.wrg.xxx

包的作用:

  • 包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
  • 包可以包含类和子包,划分项目层次,便于管理
  • 解决类命名冲突的问题
  • 控制访问权限

JDK中主要的包介绍

Java中的常用包

说明

java.lang 包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
java.net 包含执行与网络相关的操作的类和接口。
java.io -包含能提供多种输入/输出功能的类。
java.util- 包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text 包含了一些java格式化相关的类
java.sql- 包含了java进行JDBC数据库编程的相关类/接口
java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。

注意事项

  • 写项目时都要加包,不要使用默认包。
  • com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的一部分。

关键字:import

为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。语法格式:

  • import 包名. 类名; 
import pack1.pack2.Test; //import pack1.pack2.*;表示引入pack1.pack2包中的所有结构

注意:

  • 在源文件中使用import显式的导入指定包下的类或接口
  • 声明在包的声明和类的声明之间。
  • 如果需要导入多个类或接口,那么就并列显式多个import语句即可
  • 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
  • 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
  • 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
  • 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
  • import static组合的使用:调用指定类或接口下的静态的属性或方法
  • 静态导入(static  import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性和静态方法,这样我们可以直接使用静态属性和静态方法
上一篇:Java旅程 Day10


下一篇:Java自学习day10-面对对象总结(续)