write:2022-4-26
前面我们学习了Java语言的基础语法:Java语言的基本语法和规范,但是你一定听说过java是一门面向对象的开发语言,什么是面向对象呢,本文通过范例讲解。
文章目录
1.应该程序模拟现实世界
应用程序是对现实世界的模拟,而现实世界包罗万象,非常复杂,因此,实际的程序往往只针对一个特定的领域来模拟,这个特定的领域我们成为问题领域。
2.范例
2.1 问题领域
问题领域:敬老院的奶奶们
敬老院的奶奶们不仅有名字,年龄,每天还要吃饭,还会做算术:
怎么用java程序来模拟问题领域呢,就是对问题领域建立对象模型:
当我们定义一个类后,就可以创建具体的对象,这个过程叫做实例化,把对象叫做类的实例,例如根据奶奶类创造王奶奶这个对象就叫做实例化,王奶奶就是奶奶类的实例。
接下来我们就先定义类:
2.2 定义Grandma类
上面的代码看了或许存在许多疑惑,没关系,学习java,最重要的就是分析代码,我们慢慢分析:
1)属性:奶奶们的名字和年龄本身就有的,是属性;
2)构造方法:构造方法有两种
不带参数的构造方法:每个类都有它的不带参数的构造方法
带参数的构造方法:由程序员来写的,里面的参数来源于定义的属性,当程序员写了带参数的构造方法后,前面的那个不带参数的构造方法就没啥作用了
3)方法:吃东西和做算术是动作也是行为,属于方法;如果还是不能区别可看看这里:Java中的类、对象、属性和方法
怎么写方法呢:
方法的语法:方法包括修饰符、方法名、参数、返回类型和方法主体。
eg:
试着找一找下面方法中的修饰符、方法名、参数、返回类型和方法主体吧:
public int sum(int a,int b){
int sum=a+b;
return sum;
}
此时还不懂没关系,后面还会详细介绍。
2.3 创建实例
2.3.1 用new语句创建Grandma对象
Grandma wang=new Grandma(“王奶奶”,101);
Grandma zhang=new Grandma(“张奶奶",88);
Grandma sun=new Grandma(“孙奶奶",92);
1.创建对象:new+构造方法
2. 为什么是Grandma(“王奶奶”,101),因为前面定义的类中的构造方法有两个,而只要有程序员写的带参数的构造方法,就是用带参数的那个构造方法,而带参数的构造方法带了String name,int age这两个属性
3. 对象被创建后都存放在内存中,当我们想要使用这些对象,总不能每一个都是Grandma对象,wang zhang sun可以理解为是我们分为给三个创建的对象取得名字,这在java中称为变量。
2.3.2 new语句的作用
1)为Grandma对象分配内存空间
2)把Grandma对象的属性初始化为数据类型的默认值:name=null;age=0;
在Grandma类中定义了两个属性,当使用new创建对象时,就会为对象的使用初始化,例如name是String类型的,初始化就是null,age是int类型的,初始化就是0,数据类型后面还会详细讲解
3)如果声明时对属性显式初始化,那么把初始化值赋给属性:age=-1
我们发现上面写了age=-1,但我们又说了初始化age=0,矛盾了吗,其实并没有,这是因为当写程序时就已经给出了属性的值(这就叫对属性显式初始化),就采用给定的值age=-1
4)调用构造方法
5)返回对象的引用
2.3.3 构造方法的基本语法
1)构造方法的方法名和类名相同(必须相同)
2)没有返回值(返回类型+方法名)
3)允许有多个重载的构造方法(重载后面讲解)
2.3.4 调用Grandma对象的方法
前面Grandma类定义了三个方法:
当我们创建了一个对象就可以调用方法: 变量.方法名(参数)
Grandma wang=new Grandma(“王奶奶”,101);
wang.printInfo();
wang.eat(“豆浆”);
wang.add(7,8);
2.3.5 定义GrandmaTester类
前面我们讲过程序的运行入口是main方法,因此我们将创建的对象写入main()方法:
/** GrandmaTester.java */
public class GrandmaTester{
public static void main(String args[]){
Grandma wang=new Grandma(“王奶奶”,101);
wang.printInfo();
wang.eat(“豆浆”);
wang.add(7,8);
}
}
2.3.6 运行GrandmaTester类
3. 课堂小结
4. 思考题
1.运行以下Sample类,会打印什么结果?
public class Sample{
int a,b;
int c=-1;
public Sample(){a=-2;}
public Sample(int p1,int p2){a=p1; b=p2;}
public Sample(int p1,int p2,int p3){
this(p1,p2);
c=p3;
}
public static void main(String args[]){
Sample s=new Sample();
System.out.println(“a=”+s.a);
System.out.println(“b=”+s.b);
System.out.println(“c=”+s.c);
}
}
答案:
2.运行以下Sample类,会打印什么结果?
public class Sample{
int a,b;
int c=-1;
public Sample(){a=-2;}
public Sample(int p1,int p2){a=p1; b=p2;}
public Sample(int p1,int p2,int p3){
this(p1,p2);
c=p3;
}
public static void main(String args[]){
Sample s=new Sample(5,6);
System.out.println(“a=”+s.a);
System.out.println(“b=”+s.b);
System.out.println(“c=”+s.c);
}
}
答案:
3.运行以下Sample类,会打印什么结果?
public class Sample{
int a,b;
int c=-1;
public Sample(){a=-2;}
public Sample(int p1,int p2){a=p1; b=p2;}
public Sample(int p1,int p2,int p3){
this(p1,p2);
c=p3;
}
public static void main(String args[]){
Sample s=new Sample(2,3,4);
System.out.println(“a=”+s.a);
System.out.println(“b=”+s.b);
System.out.println(“c=”+s.c);
}
}
答案:
4.以下哪些可作为Grandma类的构造方法?
a) public void Grandma(){…}
b) public Grandma(int age){…}
c) grandma(){…}
d) Grandma(String s){…}
答案:b,d
5.编程题
请参照Grandma类和GrandmaTester类编写Grandpa类和GrandpaTester类。
Grandpa类表示敬老院的爷爷,他们能够做减法运算。他们也有名字和年龄属性。
在GrandpaTester类的main()方法中创建一个名叫“王爷爷”的Grandpa对象,他今年85岁,请他计算“8-5”。
现在你对面向对象开发思想有一定的认识了吗?