Java的面向对象
05-构造器、this、import、package关键字
2021-07-01 510 0
简介 构造器、this、import、package关键字
1. 构造器
构造器(或构造方法、constructor)的使用
一、构造器的作用:
1.创建对象
2.初始化对象的信息,一般是初始化对象的属性
二、说明:
1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
2.定义构造器的格式:权限修饰符 类名(形参列表){} ---- 形参列表可为空
3.一个类中定义的多个构造器,彼此构成重载
4.一旦显式的定义了类的构造器之后,系统就不再提供默认的空参构造器,提供非空参的构造器后,也提供空参的构造器
5.一个类中,至少会有一个构造器,类中一定会有构造器
//AccountTest.java package com.ylaihui.oop2; class Account{ // 属性 int id; String name; // 方法 public int getId(){ return id; } // 构造器 ---- 一个类中定义的多个构造器,彼此构成重载 public Account(){ System.out.println("Account()..."); } public Account(int i){ id = i; } } public class AccountTest { public static void main(String[] args) { //创建类的对象:new + 构造器 //我们发现 Account(), 很像一个方法,但是又不是方法, Account() 中的 Account 只能跟类名字相同 Account a = new Account(); } }
2. 属性赋值的过程
总结:属性赋值的先后顺序
① 默认初始化
② 显式初始化(定义属性的时候初始化)
③ 构造器中初始化
④ 通过"对象.方法" 或 "对象.属性"的方式,赋值
以上操作的先后顺序:① - ② - ③ - ④
//BikeTest.java package com.ylaihui.oop2; class Bike{ String name; double weight = 10.2; public Bike(){} public Bike(double w){ weight = w; } void setWeight(double w){ weight = w; } } public class BikeTest { public static void main(String[] args) { Bike b = new Bike(); System.out.println(b.weight); Bike b1 = new Bike(22.3); System.out.println(b1.weight); b1.setWeight(33.3); System.out.println(b1.weight); } }
3. this 关键字的使用
总结来说就是在调用set方法时,如果set方法的形参与属性同名,为了避免歧义, 引入了this关键字
在Java中, this关键字比较难理解,它的作用和其词义很接近。
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
this 可以调用类的属性、方法和构造器
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如: this.name = name;
//PersonTest.java package com.ylaihui.oop2; class Person{ String name; int age; public void setName(String name){ // 就近原则,这里的name是 setName 方法的形参,这里因为同名导致赋值失败 name = name; } public void setAge(int age){ // this 理解为当前对象 this.age = age; } } public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.setName("TOM"); p.setAge(11); System.out.println(p.name); System.out.println(p.age); } }
4. this关键字修饰方法或构造器
//StudentTest.java package com.ylaihui.oop2; class Student{ String name; int age; Student(){ System.out.println("null arguments constructor..."); } Student(String name){ this(); this.name = name; } Student(String name, int age){ this(name); this.age = age; } private void method(){ System.out.println("some comm fun!"); } public void show(){ this.method(); System.out.println(this.name); System.out.println(this.age); } } public class StudentTest { public static void main(String[] args) { Student s = new Student("lisimmy", 33); s.show(); } }
5.this调用构造器
① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
② 构造器中不能通过"this(形参列表)"方式调用自己----自己调自己,死循环
③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用"this(形参列表)"
④ 规定:"this(形参列表)"必须声明在当前构造器的首行
⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器(由④推出)
//StudentTest.java package com.ylaihui.oop2; class Student{ String name; int age; Student(){ System.out.println("null arguments constructor..."); } Student(String name){ this(); this.name = name; } Student(String name, int age){ this(name); this.age = age; } private void method(){ System.out.println("some comm fun!"); } public void show(){ this.method(); System.out.println(this.name); System.out.println(this.age); } } public class StudentTest { public static void main(String[] args) { Student s = new Student("lisimmy", 33); s.show(); } }
6. package关键字
1. java.lang----包含一些Java语言的核心类, 如String、 Math、 Integer、 System和Thread, 提供常用功能
2. java.net----包含执行与网络相关的操作的类和接口。
3. java.io ----包含能提供多种输入/输出功能的类。
4. java.util----包含一些实用工具类, 如定义系统特性、 接口的集合框架类、 使用与日期日历相关的函数。
5. java.text----包含了一些java格式化相关的类
6. java.sql----包含了java进行JDBC数据库编程的相关类/接口
package关键字的使用
1.为了更好的实现项目中类的管理,提出包的概念
2.使用package声明类或接口所属的包,声明在源文件的首行
3.package 属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”
4.每"."一次,就代表一层文件目录。
补充:同一个包下,不能命名同名的接口、类。
不同的包下,可以命名同名的接口、类。
7. import关键字
import关键字的使用
import:导入
1. 在源文件中显式的使用import结构导入指定包下的类、接口
2. 声明在包的声明和类的声明之间
3. 如果需要导入多个结构,则并列写出即可
4. 可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构
5. 如果使用的类或接口是 java.lang 包下定义的,则可以省略 import 结构
6. 如果使用的类或接口是本包下定义的,则可以省略import结构
7. 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。 比如 java.sql.Date java.util.Date
java.sql.Date date1 = new java.sql.Date(5243523532535L);
8. 使用"xxx.*"方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入 (* 不表示子包)
9. import static:导入指定类或接口中的静态结构:属性或方法。
import static java.lang.System.*;
import static java.lang.Math.*;
之后就可以这样使用:
out.println("hello");
long num = round(123.434);
//ImportTest.java package com.ylaihui.oop2; import java.util.Date; import static java.lang.System.*; import static java.lang.Math.*; public class ImportTest { public static void main(String[] args) { Date d = new Date(); java.sql.Date d1 = new java.sql.Date(0); out.println(d); out.println(d1); out.println("hello"); long num = round(123.434); } }