Java【10_2】封装、构造器、this、包

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()     数组的排序--从小-大【相当于冒泡排序固定式:从小-大】


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值