什么是类,什么是对象?
这是大家一开始学习最头疼的问题。教科书上的定义是类是一个抽象概念,对象是类的一个实例。但这不太好理解。下面通过一个例子来简单说明。
首先电脑是一个类,因为电脑是一个抽象概念,那什么叫做抽象概念。其实很简单,电脑是一个统称。如果我问你电脑多少钱,那你们肯定无法回答,因为你不知道我具体只哪台电脑,联想,索尼还是苹果?因为不是一个具体的实例,所以电脑是一个类。
那假如我问某台电脑是不是一个类?答案肯定是不是一个类。因为某一台电脑具体指某一个实例。
这时我问这台电脑多少钱你们就能回答我。所以具体的某一台电脑是一个对象。
总的来说,类是一个泛指,他是一些具有相同属性的对象的总称,而对象则是类的一个具体特指。
下面来说说类的一些特征:
用前面的例子。电脑具有什么特征?
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#核心基础、面向对象设计和建模、架构理论等相关...
这个单元的第二课时,着重讲解了如何处理"搭配"问题,即如何从多个元素中选取部分进行组合,且不考虑顺序。以下是关于这个主题的详细解释和拓展: 1. **组合的概念**:组合是数学中的一种基本概念,它关注的是从一...
2. 第二个问题分两部分(1)和(2)。在这里,三(2)班的学生中,31人通过了跳绳测试,35人通过了跑步测试。第一部分要求我们找出至少通过一项测试的学生人数,这相当于求两个集合的并集。第二部分则需要我们找出两...
8. **课时安排**:本单元共两课时,第一课时专注于“整理房间”,第二课时则侧重于“一起来分类”,每一课时都围绕一个核心活动展开,确保学生有足够的时间实践和理解分类。 通过以上详细讲解,我们可以看到这个...
这篇文档是针对小学三年级下册数学课程的一个教案,主要涵盖了第一单元“采访果蔬会”的第二课时内容,主题为“两、三位数除以一位数(二)”。教案旨在巩固学生对三位数除以一位数得到两位数商的计算方法,同时也...
雅思作文写作Task-1第二课时—柱状图和饼状图知识点总结 本文档旨在总结雅思作文写作Task-1第二课时关于柱状图和饼状图的知识点。以下是详细的知识点总结: 一、柱状图写作技巧 * 柱状图是动态图表,切入点是描述...
自主性则意味着人们可以根据自己的意愿选择交往的对象和方式。 2. **网络交往与现实交往的区别**:网络交往提供了方便快捷的交流方式,可以跨越地理限制,但同时也可能导致沟通的表面化和心灵距离的加大。在情感...
这份苏教版一年级数学上册第五单元第2课时的同步练习题,旨在帮助孩子们深入理解这一知识点,提升他们的数感和逻辑思维能力。 1. "数一数,涂一涂"部分: 这个环节旨在让学生了解基本的数量概念和顺序。第一题要求...
在本节《2020春三年级数学下册九数据的收集和整理二第3课时练习十二教案扫描版苏教版》中,我们将深入探讨数据的收集与整理这一核心数学概念,这对于三年级的学生来说是极其重要的基础知识。数据的收集与整理是...
第九章的主题是面向对象,主要讲解了类和对象的基本概念以及如何在Python中进行实际操作。 在面向对象编程中,类是一种模板或者蓝图,它定义了一组具有相同属性(特征)和行为(方法)的对象。对象则是类的实例,是...
《三年级品生品社上册第一课时课件 (2).ppt》是一个针对中国小学三年级学生的教学资源,主要涵盖“品德与社会”课程的第一课时内容。本课以“我的全家福”为主题,旨在引导学生理解和体验家庭的重要性,培养他们对...
【标题】:“部编版第二课时作业.doc”主要涵盖了编程基础中的变量命名规则、变量的唯一性、二进制与十进制之间的转换以及不同进制间的转换方法。 【描述】:这份作业文档旨在检验学生对编程基本概念的理解,特别是...
在unit7第七课时的PPT中,我们可以看到关于鲸类的知识点的详细介绍。鲸类是一种终生生活在水中的哺乳动物,对水的依赖程度很大,以致它们一旦离开了水便无法生活。鲸形状像鱼,鼻孔在头的上部,用肺呼吸。体长可达三...
立体几何初步是高中数学的重要组成部分,它主要探讨的是三维空间中的几何对象以及它们在二维平面上的投影。在第3课时中,我们重点关注了两种基本的投影方式:中心投影和平行投影。 中心投影是由一个点(光源)发出...