JavaSE->类和对象

目录

一、类的定义和使用

1.简单认识类

2.类的定义格式

二、类的实例化

1.定义

2.类和对象的说明

三、this引用

1.什么是this引用

2.this引用的特性

3.this的三种使用方式 

四、对象的构造及初始化

1.如何初始化对象

2.默认初始化

3.就地初始化

4.构造方法

4.1概念

4.2特性

五、封装

1.封装的概念

2.访问限定符

3.包

3.1包的概念

3.2导入包中的类

3.3自定义包

3.4常见的包

六、static成员

1.static修饰成员变量

2.static修饰成员方法

3.static成员的初始化

1.就地初始化

2.静态代码块初始化

七、代码块

1.普通代码块

2.构造代码块(实例代码块)

3.静态代码块

4.同步代码块(多线程)

八、对象的打印


一、类的定义和使用

1.简单认识类

类是用来对一个实体(对象)来进行描述的。

2.类的定义格式

//创建类
class ClassName {
   field;    //字段(属性)或者成员变量
   method;   //行为或者成员方法
}

class : 定义为类的关键字,ClassName为类的名字,{}中为类的主体。

成员变量创建若没有初始化,会默认初始化。局部变量要初始化,不初始化会编译失败。

class Dog {

    public String name;
    public String color;

    public void eat() {
        System.out.println(name + "吃狗粮");
    }
}

类名采用大驼峰定义

如:className...

二、类的实例化

1.定义

用类型创建对象的过程,称为类的实例化。

public class Text {
    public static void main(String[] args) {
//类的实例化
        Dog dog = new Dog();
        dog.name = "小黑";
        dog.color = "黑色";
    }
}
class Dog {
    public String name;
    public String color;

    public void eat() {
        System.out.println(name + "吃狗粮");
    }
}

对象的成员通过对象的引用加点号来进行访问

new关键字用于创建一个对象的实例

使用.类访问对象中的属性

同一个类可以创建多个实例

2.类和对象的说明

类只是一个模型

类是一种自定义类型

 实例化出的对象,占用实际的物理空间,存储类的成员变量

三、this引用

1.什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过this引用去访问的。

public class Text {
    public static void main(String[] args) {
        Date date = new Date();
    }
}

class Date {

    public int year;
    public int month;
    public int day;

    public void setDate(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

2.this引用的特性

this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用

this只能在"成员方法"中使用

在"成员方法"中,this中能引用当前对象,不能再引用其它对象

this是"成员方法"第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责接收。

3.this的三种使用方式 

this.date 访问当前对象的成员变量

this.func() 调用当前对象的成员方法

this() 构造方法中调用其他构造方法

四、对象的构造及初始化

1.如何初始化对象

public class Text {
    public static void main(String[] args) {
        Date date = new Date();
//初始化对象
        date.setDate(2024,9,13);
    }
}

class Date {

    public int year;
    public int month;
    public int day;

    public void setDate(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

2.默认初始化

class Date {
    public int year;
    public int month;
    public int day;
}

3.就地初始化

class Date {
    public int year = 2024;
    public int month = 9;
    public int day = 14;
}

4.构造方法

4.1概念

名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只能调用一次。

4.2特性

名字必须与类名相同

没有返回值类型,设置为void也不行

创建对象时由编译器自动调用1,并且在对象的生命周期内只调用一次

构造方法可以重载

如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的,一旦用户定义,编译器则不再生成

构造方法中,可以通过this调用其他构造方法来简化代码,this()必须是构造方法中第一条语句,不能形成环

public class Text {
    public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date(2024,9,14);   
    }
}

class Date {
    public int year = 2024;
    public int month = 9;
    public int day = 14;
    
    //无参构造方法
    public Date() {
        this.year = 2024;
        this.month = 9;
        this.day = 14;
    }

    //带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
public class Text {
    public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date(2024,9,14);   
    }
}

class Date {
    public int year = 2024;
    public int month = 9;
    public int day = 14;
    
    //无参构造方法
    public Date() {
       //调用带有三个参数的构造方法
       this(2020,9,14);
    }

    //带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

五、封装

面对对象的三大特性:封装、继承、多态。

1.封装的概念

将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

2.访问限定符

范围privatedefaultprotectedpublic
同一个包的同一类
同一个包的不同类
不同包的子类
不同包的非子类

default:什么都不写时的默认权限

访问权限除了可以限定类成员的可见性,也可以控制类的可见性。

 一般情况下成员变量设置为private,成员方法设置为public。

父类中的private修饰的成员变量在子类中不能直接访问,但也是继承到子类中了  

3.包

3.1包的概念

包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。

在一个工程中允许存在相同名称的类,只要处在不同的包中即可。

3.2导入包中的类

使用java.util.~导入

public class Text {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
//得到一个毫秒级的时间戳
        System.out.println(date.getTime());
    }
}
//1726295456837

使用import语包导入包

import java.util.Date;
public class Text {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime());
    }
}
//1726295456837

或者使用import java.util.*(如果用到了util下的某个类,才会加载,所以不用担心一下把所有的类全加载了),但建议显示的指定要导入的类名,否则还是容易出现冲突

import java.util.*;
public class Text {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime());
    }
}
//1726295456837

使用import static导入包中静态的方法和字段。

import static java.lang.Math.*;
public class Text {
    public static void main(String[] args) {
        double a = 30;
        double b = 30;
        //double c = Math.sqrt(Math.pow(a,2) + Math.pow(b,2));
        double c =  sqrt(pow(a,2) + pow(b,2));
        System.out.printf("c = %.2f\n",c);
    }
}
//42.43
3.3自定义包

基本规则:

在文件的最上方加上一个package语句指定代码在哪个包中。

包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(例如:com.tengxun.demo1)

包名要和代码路径相匹配,例如创建com.tengxun.demo1的包,那么会存在一个对应的路径com/tengxun/demo1来储存代码。

如果一个类没有package语句,则该类被放到一个默认的包中。

3.4常见的包
java.lang系统常用的基础类
java.lang.reflect反射编程包
java.net进行网络编程开发的包
java.sql进行数据库开发的支持包
java.utiljava提供的工具程序包(集合类)
java.io/O编程开发包

六、static成员

1.static修饰成员变量

static修饰的成员变量,成为静态成员变量。

静态成员变量的特性:

不属于某个具体的对象,是类的属性,所有对象所共享的,不储存正在某个对象的空间中。

既可以通过对象访问,也可以通过类名访问,但更推荐使用类名访问。

类变量储存在方法区中。

生命周期伴随类的一生(随着类的加载而加载,随类的卸载而卸载)

public static String name = "xiaohei";

2.static修饰成员方法

static修饰的成员方法,成为静态成员方法。

静态成员方法的特性:

不属于某个具体的对象,是类方法

可以通过对象调用,也可以通过类名.静态方法名(~)方式调用,更推荐后者。

不能在静态方法中访问任何非静态成员变量

静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用。

静态方法无法重写,不能用来实现多态。

3.static成员的初始化

1.就地初始化

在定义时直接给出初始值

public static String name = "xiaohei";
2.静态代码块初始化

~~~~

七、代码块

使用{}定义一段代码块

1.普通代码块

定义在方法中的代码块

public class Text {
    public static void main(String[] args) {
        {
            int x = 10;
            System.out.println("x1 = " + x);
        }
        int x = 200;
        System.out.println("x2 = " + x);
    }
}
//x1 = 10
//x2 = 200

2.构造代码块(实例代码块)

定义在类中的代码块(不加修饰符),一般用于初始化实例成员变量

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    //实例代码块
    {
        this.name = "xiaohei";
        this.gender = "man";
        this.age = 18;
        this.score = 99.9;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

构造代码块比构造方法限先执行。 

3.静态代码块

使用static定义的代码块,一般用于初始化静态成员变量

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;
    //实例代码块
    {
        this.name = "xiaohei";
        this.gender = "man";
        this.age = 18;
        this.score = 99.9;
    }
    
    //静态代码块
    static {
        classRoom = "318";
        System.out.println(classRoom);
    }
    
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

静态代码块不论生成多少个对象,其只会执行一次

静态成员变量值类的属性,因此是在JVM加载类时开辟空间并初始化的

如果一个类中类包含多个静态代码块,在编译代码时,编译器会按照定义的先后顺序依次执行

实例代码块只有在创建对象时才会执行,比构造方法先执行

4.同步代码块(多线程)

八、对象的打印

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;
    //实例代码块
    {
        this.name = "xiaohei";
        this.gender = "man";
        this.age = 18;
        this.score = 99.9;
    }

    //静态代码块
    static {
        classRoom = "318";
    }
    

    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);
    }
}
//dome1.Student@b4c966a

重写toString

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;
    //实例代码块
    {
        this.name = "xiaohei";
        this.gender = "man";
        this.age = 18;
        this.score = 99.9;
    }

    //静态代码块
    static {
        classRoom = "318";
       // System.out.println(classRoom);
    }

//重写toString
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", classRoom=" + classRoom +
                '}';
    }

    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);
    }
}
//Student{name='xiaohei', gender='man', age=18, score=99.9, classRoom=318}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值