5、java面向对象编程—-类和对象
JAVA是一种面向对象语言。支持的基本概念:①多态;②继承;③封装;④抽象;⑤类;⑥对象;⑦实例;⑧方法;⑨重载。
一、类和对象的概念
1、对象:
一切可以被描述的事物或实体。对象是类的一个实例,有状态(属性)和行为(方法)。
- 属性:特征。
- 方法:动作,行为。
2、类:
它是描述一类对象的属性特征和行为方法的集合。抽象的概念。可以看成是创建对象的模板。
3、类和对象的区别:
- ①类是从对象中抽象出来的,类是对象的抽象;①①对象是类的具体表现。
- ②类是模板,规定了所有对象共同的属性和方法;②②对象是通过模板(类)创建出来的 具体的一个实体。
- ③类是引用数据类型;③③对象是个 堆中的引用变量。
4、java类语法
-
//完整的类定义 package 包名; class 类名 extends 父类 implements 接口名 { 成员属性; 构造方法; 成员方法; }
-
//简单的类定义 public class 类名{ //定义属性部分 属性1的类型属性1; 属性2的类型属性2; ...... 属性n的类型属性n; //定义方法部分 方法1; 方法2; ...... 方法m; } //案例 public class Dog{ String bread; int age; void barking(){ } void hungry(){ } void sleeping(){ } }
一个类可以包含以下类型变量:
- 局部变量:在方法、结构方法或者语句块中定义的变量。变量声明和初始化都是在方法中,方法结束后,变量就自动销毁。
- 成员变量:定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中的方法、结构方法、和特定类的语句块访问。成员变量系统会自动初始化。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
二、类和对象的使用
1、定义属性(成员属性)
-
public class 类名{ //定义属性部分 属性1的类型属性1; 属性2的类型属性2; ...... 属性n的类型属性n; }
2、构造方法
- 构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
- 每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
- 在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
- 很多时候都是使用 Java编译器为该类提供的默认构造方法。代码中就不用自己再写啦。
-
public class Puppy{ public Puppy(){ } public Puppy(String name){ // 这个构造器仅有一个参数:name } }
3、定义方法(成员方法)
-
//访问修饰符 返回值类型 方法名称([参数1,参数2,...]){方法体;} public void pig(){...;} public int pigAge(){...;} public String pigName(...){...;} public String getComputer() { //带返回值声明的类型和返回值的类型必须一致 //只能返回一个值,但可以返回数组,也只能返回一个数组 return "购买一台联想笔记本电脑"; } //详细使用方法,参考后面的综合案例
4、创建对象
对象是根据类创建的。创建对象是为了实例化(使用)类。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字new来创建一个对象。
- 初始化:使用new创建对象时,会调用构造方法初始化对象。
-
public class Pig{ public Pig(String name){ //这个构造器仅有一个参数:name System.out.println("小猪的名字是 : " + name ); } public static void main(String[] args){ // 下面的语句将创建一个Pig对象 Pig myPig = new Pig( "tommy" ); } }
案例一:1.1、创建一个人类的类:定义属性
-
/**人类*/ public class Person { //定义属性:成员变量,实例成员变量 String name; int age; }
案例一:1.2、创建一个运行Person类的类
-
/**运行类,用对象调用类*/ public class TestPerson { public static void main(String[] args) { int n; //创建对象1 Person zhangsan = new Person(); //输出zhangsan在栈中的地址 System.out.println(zhangsan); //给对象的属性赋值 zhangsan.name = "zhangsan"; zhangsan.age = 27; //调用属性 System.out.println(zhangsan.name ); System.out.println(zhangsan.age ); //创建对象2,对象间是相互独立的,存在不同的地址中,存储地址不相同 Person wanger = new Person(); //输出wanger在栈中的存储地址 System.out.println(wanger); //给对象的属性赋值 wanger.name = "wanger"; wanger.age = 28; //调用属性 System.out.println(wanger.name ); System.out.println(wanger.age ); //将对象赋值给另一个对象,即两相同地址的栈指向同一个堆,存储地址相同 Person mazi = wanger; //把wanger这个对象赋值给mazi System.out.println(mazi); System.out.println(mazi.name); System.out.println(mazi.age); } }
5、访问实例变量和方法
通过已创建的对象来访问(调用)成员变量和成员方法
方法调用注意事项:
①在不同类中调用方法,用对象名调用;
②在同一个类中,自定义方法之间是可以互相调用的,使用this调用,当然this可以省略;
③在同一个类中,自定义的static方法,也需要创建对象,用对象名调用其它方法;
-
public class Pig{ int pigAge; public Pig(String name){ // 这个构造器仅有一个参数:name System.out.println("小猪的名字是 : " + name ); } public void setAge( int age ){ pigAge = age; } public int getAge( ){ System.out.println("小猪的年龄为 : " + pigAge ); return pigAge; } public static void main(String[] args){ /* 创建对象 */ Pig myPig = new Pig( "tommy" ); /* 通过方法来设定age */ myPig.setAge( 2 ); /* 调用另一个方法获取age */ myPig.getAge( ); /*你也可以像下面这样访问成员变量 */ System.out.println("变量值 : " + myPig.pigAge ); } }
6、源文件声明规则
当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
- 一个源文件中只能有一个public类,但可以有多个非public类,非public类不能同名。
- 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Pig,那么源文件应该命名为Pig.java。
- 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
- 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
- import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
-
7、综合案例
7.1、不带参数、有返回值的方法使用案例
例1:
-
package test2; /**定义一个类*/ public class Person { //定义属性:成员变量,实例成员变量 String name; int age; /*方法的作用:①代码重用;②方便维护;③封装。*/ //定义方法1 public void behavior() { System.out.println("*********购物********"); } //定义方法2 public void show() { //this:当前类,本类对象,可以调用本类的成员(属性,方法) // String demoName = this.name; // int demoAge = this.age; String demoName =name; int demoAge = age; System.out.println( "demoName:"+ demoName +",demoAge:"+demoAge); } //定义方法3 public String getComputer() { //声明的类型和返回值的类型必须一致 //只能返回一个值,但可以返回数组,也只能返回一个数组 return "购买一台联想笔记本电脑"; } //定义方法4 public String[] getComputerList() { //声明的类型和返回值的类型必须一致 //只能返回一个值,但可以返回数组,也只能返回一个数组 String[] strs = {"华硕","联想","戴尔"}; return strs; } }
-
package test2; /**定义一个运行类*/ import java.util.Arrays; public class TestPerson { public static void main(String[] args) { //创建对象 Person he = new Person(); //实例化(调用)属性 he.name = "xiaoMing"; he.age = 27; // System.out.println("name:"+he.name); // System.out.println("age:"+he.age); //调用不带返回值的方法 he.show(); he.behavior(); //调用带返回值的方法 String computer = he.getComputer(); System.out.println(computer); System.out.println(Arrays.toString(he.getComputerList())); Arrays.sort(he.getComputerList());//数组排序 //二分法查找,返回下标,不存在是返回负数 int i=Arrays.binarySearch(he.getComputerList(), "联想"); if (i >= 0) { System.out.println("有联想"); }else { System.out.println("无联想"); } } }
-
//运行结果 demoName:xiaoMing,demoAge:27 *********购物******** 购买一台联想笔记本电脑 [华硕, 联想, 戴尔] 有联想
例2:在控制台输入成绩,并计算总分和平均分
-
package test2; //创建一个存储计算学科成绩的类 public class Score { //定义属性,成员变量 double excel; double javaSe; double linux; double db; double sumScore; double avgScore; //定义方法1,计算总成绩 public double sum() { this.sumScore = excel + javaSe + linux + db ; return sumScore; } public double avg() { avgScore = sumScore / 4.0; return avgScore; } }
-
package test2; import java.util.Scanner; //创建一个运行类 public class TestScore { public static void main(String[] args) { //使用控制台输入 Scanner superman = new Scanner(System.in); //创建对象 Score student = new Score(); //实例化(调用)属性 System.out.print("输入excel成绩:" +"\n"); student.excel = superman.nextDouble(); System.out.print("输入javaSe成绩" + "\n"); student.javaSe = superman.nextDouble(); System.out.print("输入linux成绩"+"\n"); student.linux = superman.nextDouble(); System.out.print("输入db成绩" +"\n"); student.db = superman.nextDouble(); //调用方法 System.out.println("总分:"+student.sum()); System.out.println("均分:"+student.avg()); } }
-
//结果 输入excel成绩: 80 输入javaSe成绩 90 输入linux成绩 90 输入db成绩 90 总分:350.0 均分:87.5
7.2、带参数的方法使用案例
package test2;
/*一个源文件中可以有多个类
带参数方法的使用介绍
*/
//定义一个榨汁机类:Juicer,默认炸葡萄汁
class Juicer{
//属性,成员变量
String name = "多功能榨汁机";
//方法1:只榨葡萄汁,装好,看一下就行
public void juicing01() {
System.out.println("葡萄汁");
}
//方法2:炸出的葡萄汁,用来做葡萄酒
public String juicing02() {
return "葡萄汁";
}
//方法3:根据放入的不同食物,榨不同的汁
//加入形式参数
public String juicing03(String food) {
return food+"汁";
}
//方法4:混合果汁
public String juicing04(int i, String food1,int j , String food2) {
String mixedJuice = i+"个"+food1+"和"+ j + "个" +food2+"做的混合果汁";
return mixedJuice;
}
}
//定义一个运行类:TestJuicer
public class TestJuicer {
public static void main(String[] args) {
//创建对象
Juicer juicer = new Juicer();
//调用成员变量
System.out.println(juicer.name);
//调用方法1
juicer.juicing01();
//调用方法2
String box = juicer.juicing02();
System.out.println("拿去做葡萄酒的" + box);
//调用方法3
//传入实参
String box01 = juicer.juicing03("苹果");
System.out.println("苹果榨的" + box01);
//调用方法4
//传入多个实参,按照顺序传参,类型保持一致,个数一致
System.out.println(juicer.juicing04(2, "苹果", 1, "西瓜"));
}
}
版权声明:本文为weixin_41685388原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。