ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Java入门9 类和对象

Java入门9 类和对象 1. 面向对象的初步认知1.1 什么是面向对象Java是一门纯面向对象的语言(Object Oriented Program简称OOP)在面向对象的世界里一切皆为对象。面向对象是解决问题的一种思想主要依靠对象之间的交互完成⼀件事情。用面向对象的思想来设计程序更符合人们对事物的认知对于大型程序的设计、扩展以及维护都非常友好。1.2 面向对象与面向过程传统洗衣服过程传统的方式注重的是洗衣服的过程少了一个环节可能都不行。 而且不同衣服洗的方式时间长度拧干方式都不同处理起来就比较麻烦。如果将来要洗鞋子那 就是另⼀种方式。 按照该种方式来写代码将来扩展或者维护起来会比较麻烦。现代洗衣服过程以面向对象方式来进行处理就不关注洗衣服的过程具体洗衣机是怎么来洗衣服如何来甩干的用户不用去关心只需要将衣服放进洗衣机倒⼊洗衣粉启动开关即可通过对象之间的交互来完成的。注意面向过程和面向对象并不是一门语言而是解决问题的方法没有那个好坏之分都有其专门的应用场景。2. 类定义和使用面相对象程序设计关注的是对象而对象是现实生活中的实体比如洗衣机。但是洗衣机计算机并不认识需要开发人员告诉给计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知)但是这些简化的抽象结果计算机也不能识别开发人员可以采用某种面相对象的编程语言来进行描述比如Java语言。2.1 简单认识类类是用来对⼀个实体(对象)来进行描述的主要描述该实体(对象)具有哪些属性(外观尺寸等)哪些功能(用来干啥)描述完成后计算机就可以识别了。比如洗衣机它是⼀个品牌在Java中可以将其看成是⼀个类别。属性产品品牌型号产品重量外观尺存颜色...功能洗衣烘干、定时....在Java语言中如何对上述的洗衣机类来进行定义呢2.2 类的定义格式在Java中定义类时需要用到class关键字具体语法如下class ClassName{ //创建类 friend //属性或成员变量 method //行为或成员方法 }class为定义类的关键字ClassName为类的名字{}中为类的主体。类中包含的内容称为类的成员。属性主要是用来描述类的称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能称为类的成员方法。采用Java语言将洗衣机类在计算机中定义完成经过javac编译之后形成.class文件在JVM的基础上计算机就可以识别了。注意事项• 类名注意采用大驼峰定义• 成员前写法统⼀为public后面会详细解释• 此处写的方法不带static关键字.后面会详细解释2.3 练习• 定义一个Dog类大家可以思考一下哪些是Dog的属性哪些是Dog的行为参考代码如下• 定义⼀个学生类Student大家可以思考一下哪些是Student的属性哪些是Student的行为参考代码如下注意事项1. 一般一个文件当中只定义一个类2. public修饰的类必须要和文件名相同3. 不要轻易去修改public修饰的类的名称如果要修改通过开发工具修改3. 类的实例化3.1 什么是实例化定义了一个类就相当于在计算机中定义了一种新的类型与intdouble类似只不过int和double是java语言自带的内置类型而类是用户自定义了⼀个新的类型比如上述的PetDog类和Student类。它们都是类(⼀种新定义的类型)有了这些⾃定义的类型之后就可以使用这些类来定义实例(或者称为对象)。用类类型创建对象的过程称为类的实例化在java中采用new关键字配合类名来实例化对象。3.2 如何访问对象当中的成员注意事项• new关键字用于创建一个对象的实例.• 使用来访问对象中的属性和方法.• 同一个类可以创建多个实例.3.3 类和对象的再次理解1.类只是一个模型⼀样的东西用来对⼀个实体进行描述限定了类有哪些成员.2.类是⼀种自定义的类型可以用来定义变量.3. ⼀个类可以实例化出多个对象实例化出的对象占用实际的物理空间存储类成员变量4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东西但是并没有实体的建筑存在同样类也只是⼀个设计实例化出的对象才能实际存储数据占用物理空间。4. this关键字4.1 为什么要有this引用如下代码定义了一个Date类Date类中包含3个属性分别是yearmonthday。分别使用setDay和 printDate对进行设置和打印日期。提出2个疑问1. 形参名不小心与成员变量名相同会发生什么public void setDay(int year, int month, int day){ year year; month month; day day; }首先要搞清楚括号里的year,month,day都是形参需要接收新的数据来填充。而类中方法外的year,month,day则是成员变量成员变量有对应的默认值比如当前三个属性都是int类型所以成员变量默认值都是0我们现在的目的就是想成员变量year 形参接收到的year如果没有this关键字Java程序就会优先把左右两边同名的year,month,day都当成形参就会变成形参year 形参year这样我们的成员变量就没有改变还是默认值0无法达到我们的目的。而this关键字就是将左边同名的year,month,day都标明是成员变量这样就可以解决同名导致的问题。4.2 this是什么this引用指向当前对象(成员方法运行时调用该成员方法的对象)在成员方法中所有成员变量的操作都是通过该引用去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。此时通过指定this就能正确解决上述的2个问题了。这里之所以可以起作用关键点在于this代表的是当前对象的引用当前对象就是指哪个对象调用setDay2方法谁就是this引用4.3 this引用的特性1. this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型2. this只能在成员方法中使用3. 在成员方法非静态成员方法中this只能引用当前对象不能再引用其他对象4. this是“成员方法”第⼀个隐藏的参数编译器会自动传递在成员方法执行时编译器会负责将调用成员方法对象的引用传递给该成员方法this负责来接收5. this的使用总结this.成员变量 //访问对象的成员变量 this.成员方法 //访问对象的成员方法事实上我们也可以通过this来访问构造方法那么什么是构造方法呢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 默认初始化public class Date { public int year; public int month; public int day; public static void main(String[] args) { // 此处a没有初始化编译时报错 // Error:(24, 28) java: 可能尚未初始化变量a // int a; // System.out.println(a); Date d new Date(); System.out.println(d.year); System.out.println(d.month); System.out.println(d.day); } }对于成员变量来说如果没有进行初始化会有一个对应的默认值默认值遵循如下规则5.3 就地初始化在声明成员变量时就直接给出了初始值。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(); } }5.4 构造方法初始化5.4.1 构造方法概念构造方法(也称为构造器)是⼀个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用一次。5.4.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类中没有定义任何构造方法编译器会默认生成⼀个不带参数的构造方法。6. 构造方法中可以通过this调用其他构造方法来简化代码public class Date { public int year; public int month; public int day; public Date(){ this(1900, 1, 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(); }7. 绝大多数情况下使用public来修饰特殊场景下会被private修饰(后序讲单例模式时会遇到)6. 对象的打印如果我们直接打印对象的引用此时输出的结果为类路径名对象的hashcode值。public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name name; this.gender gender; this.age age; } public static void main(String[] args) { Person person new Person(Jim,男, 18); System.out.println(person); } }如果想要默认打印对象中的属性该如何处理呢答案重写toString方法即可public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name name; this.gender gender; this.age age; } Override public String toString() { return [ name , gender , age ]; } public static void main(String[] args) { Person person new Person(Jim,男, 18); System.out.println(person); } } // 输出结果[Jim,男,18]
返回列表