罗湖网站设计公司哪家好,国外大型门户网站,做木业网站怎样起名,拆分盘网站建设 个人主页#xff1a;秋风起#xff0c;再归来~ 文章专栏#xff1a;javaSE的修炼之路 个人格言#xff1a;悟已往之不谏#xff0c;知来者犹可追 克心守己#xff0c;律己则安#xff01; 1、类的定义格式
在java中定义类时需要用到… 个人主页秋风起再归来~ 文章专栏javaSE的修炼之路 个人格言悟已往之不谏知来者犹可追 克心守己律己则安 1、类的定义格式
在java中定义类时需要用到class关键字具体语法如下
// 创建类
class ClassName{ field; // 字段(属性) 或者 成员变量method; // 行为 或者 成员方法
} class为定义类的关键字ClassName为类的名字{}中为类的主体。 比如洗衣机它是一个品牌在Java中可以将其看成是一个类别。 属性产品品牌型号产品重量外观尺寸颜色... 功能洗衣烘干、定时....
类中包含的内容称为类的成员。属性主要是用来描述类的称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能称为类的成员方法。
举一个简单的栗子啦~
class WashMachine{public String brand; // 品牌public String type; // 型号public double weight; // 重量public double length; // 长public double width;// 宽public double height; // 高public String color; // 颜色public void washClothes(){System.out.println(洗衣服);}
}
采用Java语言将洗衣机类在计算机中定义完成经过javac编译之后形成.class文件在JVM的基础上计算机就可以 识别了。
注意事项
1. 一般一个文件当中只定义一个类
2. main方法所在的类一般要使用public修饰(注意Eclipse默认会在public修饰的类中找main方法) 3. public修饰的类必须要和文件名相同
4. 不要轻易去修改public修饰的类的名称如果要修改通过开发工具修改。
下面通过IDEA来看一下怎么修改 2、类的实例化
定义了一个类就相当于在计算机中定义了一种新的类型与intdouble类似只不过int和double是java语言自 带的内置类型而类是用户自定义了一个新的类型。
它们都是类(一种新定 义的类型)有了这些自定义的类型之后就可以使用这些类来定义实例(或者称为对象)。 用类类型创建对象的过程称为类的实例化在java中采用new关键字配合类名来实例化对象。 class PetDog{public String name;public String color;public void bark(){System.out.println(汪汪叫~~);}public void wag(){System.out.println(摇尾巴~~);}
}
public class Test {public static void main(String[] args) {PetDog dog1new PetDog();//通过new实例化对象dog1.name阿黄;dog1.color黑黄;System.out.println(dog1.name);System.out.println(dog1.color);dog1.bark();dog1.wag();}
} 注意事项
1. new 关键字用于创建一个对象的实例.
2. 使用 . 来访问对象中的属性和方法.
3。同一个类可以创建多个实例.
3、类和对象的说明
1. 类只是一个模型一样的东西用来对一个实体进行描述限定了类有哪些成员.
2. 类是一种自定义的类型可以用来定义变量.
3. 一个类可以实例化出多个对象实例化出的对象 占用实际的物理空间存储类成员变量
4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东 西但是并没有实体的建筑存在同样类也只是一个设计实例化出的对象才能实际存储数据占用物理空间 4、this引用
4.1为什么要有this引用
下面我先举一个栗子~
class Data{public int year;public int month;public int day;public void setData(int y,int m,int d){yeary;monthm;dayd;}public void show(){System.out.println(年year 月month 日day);}
}
public class Test {public static void main(String[] args) {Data data1new Data();//新建一个对象Data data2new Data();Data data3new Data();data1.setData(2024,1,30);//引用对象的函数赋值日期data2.setData(2024,2,30);data3.setData(2024,3,30);data1.show();//引用对象的函数打印数据data2.show();data3.show();} 现在看上面的代码似乎没有任何问题~
但我们仔细思考就会以下有两个问题
1.但如果形参名与变量名相同怎么办呢 public void setData(int year,int month,int day){yearyear;monthmonth;dayday;}
那函数体中到底是谁给谁赋值成员变量给成员变量参数给参数参数给成员变量成员变量参数估计自己都搞不清楚了。下面看一下改变之后的结果~ 为什么呢
其实原因很简单局部变量优先在方法中它认为只是形参自己给自己赋值了并没有给成员变量赋值~
2. 三个对象都在调用setDate和printDate函数但是这两个函数中没有任何有关对象的说明setDate和 printDate函数如何知道打印的是那个对象的数据呢 一切让this引用来揭开这层神秘的面纱~
4.2什么是this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象)在成员方法中所有成员变量的操作都是通过该 引用去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。
class Data{public int year;public int month;public int day;public void setData(int year,int month,int day){this.yearyear;this.monthmonth;this.dayday;}public void show(){System.out.println(年year 月month 日day);}
}
注意this引用的是调用该成员方法的对象
public static void main(String[] args) {Date d new Date();d.setDay(2020,9,15);d.printDate();
}4.3this引用的特性
1. this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型
2. this只能在成员方法中使用
3. 在成员方法中this只能引用当前对象不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数编译器会自动传递在成员方法执行时编译器会负责将调用成员方法 对象的引用传递给该成员方法this负责来接收
在代码层面来简单演示---注意下图右侧中的Date类也是可以通过编译的~ 5、对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道在Java方法内部定义一个局部变量时必须要初始化否则会编译失败。
public static void main(String[] args) {int a;System.out.println(a);
}// Error:(26, 28) java: 可能尚未初始化变量a
要让上述代码通过编译非常简单只需在正式使用a之前给a设置一个初始值即可。如果是对象
public static void main(String[] args) {Date d new Date();d.printDate();d.setDate(2021,6,9);d.printDate();
}// 代码可以正常通过编译 需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题 1. 每次对象创建好后调用SetDate方法设置具体日期比较麻烦那对象该如何初始化
2. 局部变量必须要初始化才能使用为什么字段声明之后没有给值依然可以使用
5.2 构造方法
5.2.1 概念
构造方法(也称为构造器)是一个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且 在整个对象的生命周期内只调用一次。
public class Date {public int year;public int month;public int day;// 构造方法// 名字与类名相同没有返回值类型设置为void也不行// 一般情况下使用public修饰// 在创建对象时由编译器自动调用并且在对象的生命周期内只调用一次public Date(int year, int month, int day){this.year year;this.month month;this.day day;System.out.println(Date(int,int,int)方法被调用了);}public void printDate(){System.out.println(year - month - day);}public static void main(String[] args) {// 此处创建了一个Date类型的对象并没有显式调用构造方法Date d new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了d.printDate(); // 2021-6-9}
}注意构造方法的作用就是对对象中的成员进行初始化并不负责给对象开辟空间。
5.2.2 特性
1. 名字必须与类名相同
2. 没有返回值类型设置为void也不行
3. 创建对象时由编译器自动调用并且在对象的生命周期内只调用一次(相当于人的出生每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {public int year;public int month;public int day;// 无参构造方法public Date(){this.year 1900;this.month 1;this.day 1;}
// 带有三个参数的构造方法public Date(int year, int month, int day) {this.year year;this.month month;this.day day;}public void printDate(){System.out.println(year - month - day);}public static void main(String[] args) {Date d new Date();d.printDate();}
}上述两个构造方法名字相同参数列表不同因此构成了方法重载。
5.如果用户没有显式定义编译器会生成一份默认的构造方法生成的默认构造方法一定是无参的。
public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year - month - day);}public static void main(String[] args) {Date d new Date();d.printDate();}
}
上述Date类中没有定义任何构造方法编译器会默认生成一个不带参数的构造方法。
注意一旦用户定义编译器则不再生成。
public class Date {public int year;public int month;public int day;public Date(int year, int month, int day) {this.year year;this.month month;this.day day;}
public void printDate(){System.out.println(year - month - day);}public static void main(String[] args) {// 如果编译器会生成则生成的构造方法一定是无参的// 则此处创建对象是可以通过编译的// 但实际情况是编译期报错Date d new Date();d.printDate();}
}/*
Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;需要: int,int,int找到: 没有参数原因: 实际参数列表和形式参数列表长度不同
*/6. 构造方法中可以通过this调用其他构造方法来简化代码
public class Date {public int year;public int month;public int day;// 无参构造方法--内部给各个成员赋值初始值该部分功能与三个参数的构造方法重复// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法// 但是this(1900,1,1);必须是构造方法中第一条语句public Date(){//System.out.println(year); 注释取消掉编译会失败this(1900, 1, 1);//this.year 1900;//this.month 1;//this.day 1;}// 带有三个参数的构造方法public Date(int year, int month, int day) {this.year year;this.month month;this.day day;}
}
注意this(...)必须是构造方法中第一条语句并且不能形成环~
public Date(){this(1900,1,1);
}public Date(int year, int month, int day) {this();
}/*
无参构造器调用三个参数的构造器而三个参数构造器有调用无参的构造器形成构造器的递归调用
编译报错Error:(19, 12) java: 递归构造器调用
*/7. 绝大多数情况下使用public来修饰特殊场景下会被private修饰(后序讲单例模式时会遇到)
5.3 默认初始化
public class Date {public int year;public int month;public int day;public Date(int year, int month, int day) {// 成员变量在定义时并没有给初始值, 为什么就可以使用呢System.out.println(this.year);System.out.println(this.month);System.out.println(this.day);}public static void main(String[] args) {// 此处a没有初始化编译时报错// Error:(24, 28) java: 可能尚未初始化变量a// int a;// System.out.println(a);Date d new Date(2021,6,9);}
} 要搞清楚这个过程就需要知道 new 关键字背后所发生的一些事情
Date d new Date(2021,6,9); 在程序层面只是简单的一条语句在JVM层面需要做好多事情下面简单介绍下
1. 检测对象对应的类是否加载了如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如多个线程同时申请对象JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间 即对象空间被申请好之后对象中包含的成员已经设置好了初始值比如 5. 设置对象头信息(关于对象内存模型后面会介绍)
6. 调用构造方法给对象中各个成员赋值
5.4 就地初始化
在声明成员变量时就直接给出了初始值
public class Date {public int year 1900;public int month 1;public int day 1;public Date(){}public Date(int year, int month, int day) {}public static void main(String[] args) {Date d1 new Date(2021,6,9);Date d2 new Date();}
}
注意代码编译完成后编译器会将所有给成员初始化的这些语句添加到各个构造函数中
6、 完结散花
好了这期的分享到这里就结束了~
如果这篇博客对你有帮助的话可以用你们的小手指点一个免费的赞并收藏起来哟~
如果期待博主下期内容的话可以点点关注避免找不到我了呢~
我们下期不见不散~~