目录
一、类的定义和使用
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.访问限定符
范围 | private | default | protected | public |
同一个包的同一类 | ||||
同一个包的不同类 | ||||
不同包的子类 | ||||
不同包的非子类 |
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.util | java提供的工具程序包(集合类) |
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}