1. 构造器 类的五大成员之第三大成员
成员变量、成员方法、构造器、初始化块、内部类
构建对象的(实例化对象的)
又称为构造方法(和方法类似)
2. 构造器语法
方法:修饰符 返回值类型 方法名(形参列表){代码块}
构造器:
① 没有返回值(void也没有)
② 方法名必须和类名一致
结果:修饰符 类名(形参列表){代码块}
3. 构造器的执行时机
在实例化对象时,调用!实例化一次调用一次
注意:
a. 任何一个类默认都存在一个无参构造器
b. 如果你写了构造器就会覆盖,如果你不写,就默认存在无参构造器
c. 构造器可以重载
4. 封装类(JavaBean)
必备的三要素
a. 私有的属性
b. 公有的get/set方法
c. 公有的无参构造器
一般的情况
a. 私有的属性
b. 公有的get/set方法
c. 全参构造器(所有属性值的初始化)
d. 显示的创建无参构造器
e. getInfo()方法--->toString()
问题:
这样除了修改的情况是不是就不用对象.set了
构造器和set方法各有用途!
有参构造器:在实例化对象的时候就已知属性值
set:单个属性值的修改
构造器 会覆盖 不重载?
会重载
那我以后不想调用构造器,岂不是对象都不敢创建了?
不想调用构造器,就写一个无参构造器,无任何内容
可变参数用用在这里吗
可以,构造器的形参和方法的形参一致
new俩个无参的对象调的是同一个无参的构造器吗?
是的!
构造方法可以被对象调用吗?就是对象调用(正在实例化的这个对象)
构造器只能new的时候调用!
要写有参的话必须再写一个无参的?
对
练习:
(1)声明一个员工类,
- 包含属性:编号、姓名、薪资、性别,要求属性私有化,提供get/set,
- 提供无参构造器和有参构造器
- 提供getInfo()
(2)在测试类的main中分别用无参构造和有参构造创建员工类对象,调用getInfo
5. this关键字
含义:当前对象(不是当前类)
5.1 this.内容(属性、方法)
场合:所有方法(包括构造器)
用途:区分局部变量和成员变量重名的问题
在java的封装类中,是允许成员变量和局部变量重名的
如果成员变量和局部变量重名,那么默认识别的是局部变量,
想要访问成员变量就是用this.属性名
如果没有重名,this可以省略
5.2 this()
场合:应用在构造器
功能:调用本类的其他构造器
注意事项:this()必须在构造器的首行
6. 标准的javaBean
javaBean-->实体类
`JavaBean` 是 Java语言编写类的一种标准规范。符合 `JavaBean` 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,成员变量私有化,并提供用来操作成员变量的 `set` 和 `get` 方法。
7. 包
第一天接触idea的时候,创建过包,比如:
package com.atguigu.bean;
语法:全小写,级别的分割是通过.
作用:
a. 避免类的重名(有必要创建两个同名的类)
b. 分门别类的管理
java.lang包下的内容是核心内容!
String/Math/System...
java.net
java.io
java.sql
java.time
java.util
Scanner
....
c. 可以控制某些类型或成员的可见范围
访问修饰符的 缺省的
使用方式:
使用其他包下的内容的时候,需要导包!(java.lang包下不用)
位置:类声明的上方
语法:import java.util.Scanner;
import java.util.*; 导入java.util下所有内容(一般很少这么做!)
8. static --> 静态的
【static 不允许修饰构造器 ★,可以修饰成员变量、成员方法、初始化块、内部类】
成员变量
实例变量: 属于对象的
类变量 : 属于类的 在成员变量上添加修饰符static
如何使用:
对象.属性(符合权限修饰符的范围) 不推荐
类名.属性(符合权限修饰符的范围) √ 推荐
成员方法
实例方法: 属于对象
类方法: 属于类 在成员方法上添加修饰符static
在加载的时候,依然是先加载静态方法,在加载普通方法
使用方便:
对象.方法
类名.方法 √ 不依赖于对象,工具类的方法就设置为static
使用注意事项:
静态资源内只能直接使用静态资源,不能直接使用非静态资源
因为静态资源内没有this关键字
非静态资源内都可以直接使用
初始化块(待讲)
内部类(待讲)
static用途:
用于属性,是为了资源共享
用于方法,是为了类名调用方便
9. 静态导入
import static java.lang.Math.*;
10. 一些工具类的介绍
10.1 数组工具类Arrays
copyOf() 数组的拷贝--用于数组的扩容
sort() 数组的排序--从小-大
基本数据类型+String
toString() 将数组的内容,拼接成字符串返回
10.2 系统类System
System.currentTimeMillis(); 1970-1-1凌晨距离此时此刻的毫秒数
System.exit(int) 系统退出
10.3 数学类Math
random() 产生[0-1)随机数
abs(int) 绝对值
ceil(double) 向上取整(比参数大的最近的整数)
floor(double) 向下取整(比参数小的最近的整数)
round(double) 四舍五入
pow(int a,int b) a的b次方
sqrt(double a) 开根号
PI 圆周率
max(double x, double y):返回x,y中的最大值
min(double x, double y):返回x,y中的最小值
11. API(学习帮助文档)
只要是java提供的类,在API中都能查到
练习:
1. 统计一段代码的运行时间
【注】后期很多框架,都会默认采用无参构造器。所以,是类里面必须要有的东西,可以避免很多不必要的麻烦。
示例:this 区分局部变量和成员变量重名的问题
public class Car {
private int id;
private string name;
private String color;
public void setId() {
int id;//同一个作用域内不允许重名的变量
//String id; //报错
}
}
【06】04:00
同一个作用域内不允许重名的变量,为什么类中可以?
setId方法中的 int id; 和 类中的 private int id;
因为内存存储的位置是不一样的!一个在栈,一个在堆。并且可以通过 this. 区分。
示例:【07】02:40
public class Car {
private int id=20;
private String name;
private String color;
public Car(int id,String name,String color){
this(name,color);//调用本类的其他构造器,this()必须在构造器的首行
this.id=id;
System.out.println("三个参数");
}
public Car(String name,String color){
System.out.println("两个参数");
this.name=name;
this.color=color;
}
public Car(String color){
System.out.println("一个参数");
this.color=color;
}
public Car(){
System.out.println("无参。。。");
}
}
【08】01:06 快捷键介绍
public class Animal {
private int id;
private String name;
private int age;
private String color;
private char gender;
}
上面代码,在类里面的空白位置,快捷键(Alt+Insert)-> Getter and Setter 【让idea自动生成】-> 全选生成
【10】09:00 导包,只有 java.lang 下面的不需要导包。类引用本包下的东西也不需要导包
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
//使用其他包的类
String str="java";//使用了java.lang.String
Math.random();//使用了java.lang.Math
Scanner input=new Scanner(System.in);
}
}
【10】10:40
有时候,代码没问题,idea中报红线(几率较小,偶尔出现),就全部 Ctrl+a,再Ctrl+x,再Ctr+v 重新复制、粘贴一下。
【10】17:50
如何编译和运行(了解,之后在idea中就不用了)
编译格式:
javac -d class文件存放路径 源文件路径名.java
示例:
package com.atguigu.demo;
public class TestPackage {
public static void main(String[] args) {
System.out.println("hello package");
}
}
编译:
javac -d . TestPackage.java
其中 . 表示在当前目录生成包目录
运行:
java com.atguigu.demo.TestPackage
定位到com目录的外面才能正确找到这个类
使用类的全名称才能正确运行这个类
【11】05:10 实例变量的类加载内存图
类加载的时机:
在第一次使用这个类的时候,先加载,后使用
类只加载一次,在没有卸载之前不会在加载
(在方法区每一个类只有一个加载信息)
【注】
加载的是编译后的class字节码文件,.java源文件对于运行没有任何作用。
加载的属性/方法/构造器/父类等等……所有东西,都记录下来,
只是做记录(修饰符、属性名、方法名、返回值类型、形参列表等等是什么),
属性不开空间(等到new时才在堆中开空间),代码体不执行(因为还没调用)。
卸载,指这个类所有对象都被垃圾回收了,才会卸载。
示例代码:
public class Phone {
private int id;
private String name;
public double price;
public Phone(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public String getInfo(){
return id+"\t"+name+"\t"+price;
}
}
public class Demo4 {
public static void main(String[] args) {
Phone phone1=new Phone(1,"华为mate40",5000);
Phone phone2=new Phone(2,"苹果12",6000);
System.out.println(phone1.getInfo());
System.out.println(phone2.getInfo());
}
}
实例变量的类加载内存图
【11】16:00 类变量的类加载内存图
类在加载的时候,
① 先加载所有的静态资源
② 在加载所有的普通资源
静态的属性,空间开辟在方法区内,
并且只有一份,原因类只加载一次,
所有对象操作该属性的时候,操作的
都是方法区内这个一个空间,达到共
享的目的
在上面“实例变量的类加载内存图”中把 price 改为静态变量。
public static double price;
则会在类加载时,在方法区立刻开辟静态 price空间,初始值=0
类变量的类加载内存图
【13】静态资源内只能直接使用静态资源,不能直接使用非静态资源
因为静态资源内没有this关键字
非静态资源内都可以直接使用
示例:
public class Phone {
private int id;
private String name;
public static double price;//price就变为了类变量(属于类的-->所有对象共享)
public void method(){
System.out.println("普通方法"+id+price);
method1();
}
public static void method1(){
System.out.println("普通方法1");
}
public static void function(){//Phone.function() 没有对象
//method();//method不行,依赖于对象,
method1();//method1是可以的
System.out.println("静态方法"+price);//用不了id,但是能用price
}
}
【13】12:45
static 不允许修饰构造器 ★
public class Phone {
public static Phone() { //报错
}
}
示例:9. 静态导入
import static java.lang.Math.*;
//import static java.lang.Math.PI; //或者这样,使用如下面的
public class Demo4 {
public static void main(String[] args) {
System.out.println(PI);
}
}
【15】02:40
ctrl+p 看形参列表
数组的扩容 copyOf
Arrays.sort() 数组的排序--从小-大【相当于冒泡排序固定式:从小-大】