什么是类,什么是对象?
这是大家一开始学习最头疼的问题。教科书上的定义是类是一个抽象概念,对象是类的一个实例。但这不太好理解。下面通过一个例子来简单说明。
首先电脑是一个类,因为电脑是一个抽象概念,那什么叫做抽象概念。其实很简单,电脑是一个统称。如果我问你电脑多少钱,那你们肯定无法回答,因为你不知道我具体只哪台电脑,联想,索尼还是苹果?因为不是一个具体的实例,所以电脑是一个类。
那假如我问某台电脑是不是一个类?答案肯定是不是一个类。因为某一台电脑具体指某一个实例。
这时我问这台电脑多少钱你们就能回答我。所以具体的某一台电脑是一个对象。
总的来说,类是一个泛指,他是一些具有相同属性的对象的总称,而对象则是类的一个具体特指。
下面来说说类的一些特征:
用前面的例子。电脑具有什么特征?
1.价格 2.品牌 3.外观......
其次,电脑还具有一些功能
1.办公 2.玩游戏....
在java中也类似,每一个类都具有自己的属性(及上面说到的特征)
每一个类都有自己的方法(及上面说的功能)
定义一个类
public class 类名{
属性
方法
}
如:
public class Computer{
private String brand;//定义一个品牌属性
private double price;//定义一个价格属性
public void play(){
......//定义一个play方法
}
}
补充一个知识点,一个.java文件中只能有一个public类,也就是说可以有多个类,但前面不能加public,但不建议这样作,最好是一个文件一个类(内部类除外)。
实例化一个类:
类名 对象名 = new 类名();
Computer com = new Computer();
方法调用:
com.play();//调用play()方法,用法与c语言中结构类型相似
又有同学会问,为什么不能直接使用play(),这就体现了面向对象编程思想,具体到是哪个对象调用了哪个方法。
构造方法:
在类中分为普通方法和构造方法。
其中,普通方法已经介绍过了,下面来看看构造方法。
构造方法是用来实例化对象和初始化对象的,
如 Student stu = new Student();
其中Student(),就是构造方法,当使用new时会在堆(heap)中开辟一个内存,接着,Student()
构造方法会在开辟的内存里面写入类的属性和方法,最后返回一个地址给stu。
那么,问题就来了,有的同学会问,既然Student()是构造方法,但我在;类里面没有写这个构造方法,为什么能调用?原因是java中,如果没有写构造方法,那么系统会默认调用一个构造方法。
构造方法的定义:
public 类名(数据类型 形参名,...){
方法。。。
}
这里要注意的是,构造方法中没有数据类型返回(包括void也不能有),还有一点,如果已经定义一个构造方法,则系统不再调用默认构造方法。
方法重载:
条件:
1.方法名字要完全一样
2.方法带的参数类型,个数,顺序不完全一样
这也就是说,返回值类型无影响
如:public void fun(){}
public void fun(int a){}//这两个是方法在重载
public void fun(){}
public void fun(){}//这两个不是方法在重载
this关键字:
this 顾名思义即是指这个,也就是当前对象。
如 Student类中有name属性,那么this.name 则表示当前对象的name。
this还有另一种用法
public Student(String name){
。。。
}
public Student(){
this(“。。”); // 构造方法里面使用this()指的是调用当前对象的另一个构造方)
} //前提是有这个构造方法
传值与传引用:
学过c语言的同学都知道,所谓传值,则是传实参的一个副本,形参的改变不影响实参。传地址则会影响实参,因为下一种指向实参的地址,会改变实参的值。
java中没有指针的说法,但传引用与传指针类似。
如 public static void main(String[] args){
Student stu = new Student();
int a=10;
fun(a,stu);
}
public static void fun(int a , Student stu){
stu.setName("..");
a=19;
}//这个例子中 a传的是指,而stu传的是引用,那么fun()中改变的a不会影响main()中的a,而//fun()中改变的name,会影响main()中stu里面的name。因为stu传递的是地址
有的同学可能会问,既然传的是地址,那么干嘛不干脆叫传指针,改名传引用。其实这个问题我也想过,学习过c#得同学会跟清楚,这里我只做简单介绍。因为c语言中的指针是直接对内存进行操作,这样的话对于程序来说是不安全的,严重的可能使程序崩溃,而面向对象中有一个思想即是对数据的封装,这样会增加程序的安全性。所以指针的使用违背的面向对象编程思想,所以在java中禁止了指针的使用.
实例:编写一个英雄类与一个Boss类,实现双方的战斗
public class Hero { private int blood; private int harm; private String name; /** * 构造方法,初始化name,harm,blood属性 * @param name * @param harm * @param blood */ public Hero(String name,int harm,int blood){ this.name=name; this.harm=harm; this.blood=blood; } public Hero(){ this("",0,0); } /** * 定义一个获得血量方法 * @return 血量 */ public int getBlood() { return blood; } /** * 定义一个设置血量方法,当血量少于0时,血量设为0 * @param blood */ public void setBlood(int blood) { if(blood<0){ this.blood=0; }else{ this.blood = blood; } } /** * 定义一个获得伤害方法 * @return 血量 */ public int getHarm() { return harm; } /** * 定义一个设置血量方法 * @param blood */ public void setHarm(int harm) { this.harm = harm; } /** * 定义一个获得名字方法 * @return 血量 */ public String getName() { return name; }/** * 定义一个设置血量方法 * @param blood */ public void setName(String name) { this.name = name; } /** * 定义一个攻击方法 */ public void attack(Boss b){ b.setBlood(b.getBlood()-harm); } }
/** * 定义一个Boss类 * @author chenzhaomin * */ public class Boss { private int blood; private int harm; private String name; /** * 构造方法,初始化name,harm,blood属性 * @param name * @param harm * @param blood */ public Boss(String name,int harm,int blood){ this.name=name; this.harm=harm; this.blood=blood; } public Boss(){ this("",0,0); } /** * 定义一个获得血量方法 * @return 血量 */ public int getBlood() { return blood; } /** * 定义一个设置血量方法 * @param blood */ public void setBlood(int blood) { if(blood<0){ this.blood=0; }else{ this.blood = blood; } } /** * 定义一个获得伤害方法 * @return 血量 */ public int getHarm() { return harm; } /** * 定义一个设置血量方法 * @param blood */ public void setHarm(int harm) { this.harm=harm; } /** * 定义一个获得名字方法 * @return 血量 */ public String getName() { return name; }/** * 定义一个设置血量方法 * @param blood */ public void setName(String name) { this.name = name; } /** * 定义一个攻击方法 */ public void attack(Hero h){ h.setBlood(h.getBlood()-harm); } }
import java.util.Random; public class Fight { /**主函数 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Hero h = new Hero("德玛西亚",10,100);//实例化一个Hero对象 Boss b = new Boss("男爵",10,100);//实例化一个Boss对象 startFight(h,b);//调用战斗方法 } /** * 定义一个战斗方法 * @param h * @param b */ public static void startFight(Hero h,Boss b){ Random r = new Random();//定义一个随机数 /** * 利用随机数来确定谁开始战斗,循环战斗 */ while(true){ boolean bool = r.nextBoolean(); System.out.println(h.getName() + "HP = " + h.getBlood() + " \t " + b.getName() + "HP = " + b.getBlood()); if(bool){ h.attack(b); if(b.getBlood()==0){ System.out.println(h.getName() + " win!");//显示获胜者 return ; } }else{ b.attack(h); if(h.getBlood()==0){ System.out.println(b.getName() + " win!");//显示获胜者 return ; } } } } }
总结:类似一个统称,对象是一个实例。在面向对象编程中,必须要清楚具体是哪个对象调用了哪个方法
相关推荐
在教学过程中,教师将通过回顾之前的内部类和类特殊方法,逐步引入新概念,并通过实例和互动讨论帮助学生理解这些复杂的面向对象概念。此外,教师还将强调每个知识点的重点和难点,通过练习和作业巩固学生的理解和...
根据提供的文件内容,本篇面向对象上机练习主要涉及C++中的类设计、对象创建、成员函数的使用、构造函数、以及具体的工资计算业务...通过这样的练习,可以提高编程技能,加深对类设计、对象操作和业务逻辑实现的理解。
人教版五年级数学上册第四单元第二课时所涉及的内容——用字母表示数,正是开启这扇大门的钥匙。本课时通过一系列贴近生活的实例,向学生们展示了一个崭新的数学世界,在这个世界里,字母不再仅仅是英语课上的学习...
在本课程中,我们主要探讨的是“魔方1.0版”的第三个课时,这个课时专注于源码的实现和理解。在这个阶段,学生将学习如何编写和理解用于魔方旋转和放大缩小功能的程序代码。为了更好地理解这些概念,我们将深入到...
在本课程的第1章第1课时中,我们将深入理解ASP的基础知识,包括其工作原理、基本结构和核心组件。 首先,ASP运行在IIS(Internet Information Services)上,这是微软提供的一个强大的Web服务器,能够处理HTTP请求...
第二课时,教师会引导学生探索在方格纸上进行图形旋转的特点和性质,比如如何将复杂图形旋转90°,并通过实际操作和练习来加深理解。 【教学目标】 第二课时的教学目标与第一课时类似,强调在方格纸上的操作,同时...
课程内容包括三个主要工具类的实现:Singleton模板、IOC容器和TypeEventSystem(基于类型的事件机制)。尽管这些工具类的讲解仅占课程的10%,但课程主体将深入讲解C#核心基础、面向对象设计和建模、架构理论等相关...
第二个问题分为两个部分,第一部分是找出三(2)班至少通过一项测试的学生人数,这同样涉及到并集的概念。班上有31人通过了跳绳测试,35人通过了跑步测试,那么至少通过一项测试的学生人数就是这两个集合的并集,即...
8. **课时安排**:本单元共两课时,第一课时专注于“整理房间”,第二课时则侧重于“一起来分类”,每一课时都围绕一个核心活动展开,确保学生有足够的时间实践和理解分类。 通过以上详细讲解,我们可以看到这个...
相似三角形是几何学中的一个基础概念,它不仅是理论研究的对象,更在现实世界中有着广泛的应用。从测量建筑物的高度到确定地图上两点之间的实际距离,相似三角形的性质为我们提供了一种简便有效的解决办法。在本课时...
雅思作文写作Task-1第二课时—柱状图和饼状图知识点总结 本文档旨在总结雅思作文写作Task-1第二课时关于柱状图和饼状图的知识点。以下是详细的知识点总结: 一、柱状图写作技巧 * 柱状图是动态图表,切入点是描述...
总之,第二课时的教案是我们与学生共同探索统计学世界的一个重要环节。我们期待通过这节课,激发学生们对数据的兴趣,培养他们的逻辑思维和批判性思考能力,并为他们未来的学习和生活打下坚实的数据基础。教师应该...
自主性则意味着人们可以根据自己的意愿选择交往的对象和方式。 2. **网络交往与现实交往的区别**:网络交往提供了方便快捷的交流方式,可以跨越地理限制,但同时也可能导致沟通的表面化和心灵距离的加大。在情感...
这份苏教版一年级数学上册第五单元第2课时的同步练习题,旨在帮助孩子们深入理解这一知识点,提升他们的数感和逻辑思维能力。 1. "数一数,涂一涂"部分: 这个环节旨在让学生了解基本的数量概念和顺序。第一题要求...
在本节《2020春三年级数学下册九数据的收集和整理二第3课时练习十二教案扫描版苏教版》中,我们将深入探讨数据的收集与整理这一核心数学概念,这对于三年级的学生来说是极其重要的基础知识。数据的收集与整理是...
部编第二课时的文档内容,正是这样一个典型的例子,它涵盖了汉字拼音、词汇搭配、课文理解以及诗词创作等多个方面,不仅让学生在学习过程中能够稳步前行,也让他们在知识的海洋中自由地遨游。 首先,汉字拼音是语文...
例如,“左边第3个”、“左边3个”、“右边第2个”、“右边2个”,这类活动有助于学生理解“第”与“几个”的区别。“第几个”强调的是位置的特定性,而“几个”则关注的是数量的统计。通过这样的练习,学生能够更加...
第九章的主题是面向对象,主要讲解了类和对象的基本概念以及如何在Python中进行实际操作。 在面向对象编程中,类是一种模板或者蓝图,它定义了一组具有相同属性(特征)和行为(方法)的对象。对象则是类的实例,是...
随着知识的深入,第二题引入了数据整理与表格填写的知识点。在这一部分,孩子需要对图形按照形状和颜色进行分类,并将分类的结果填写到相应的表格中。这个过程使孩子们接触到了基础统计学的原理,学会了如何系统地...
【标题】:“部编版第二课时作业.doc”主要涵盖了编程基础中的变量命名规则、变量的唯一性、二进制与十进制之间的转换以及不同进制间的转换方法。 【描述】:这份作业文档旨在检验学生对编程基本概念的理解,特别是...