7月7日 类和对象2(续)
类中的方法有两种:
普通方法,可以理解为对象的行为
构造方法,专门用来实例化对象的方法(另外一个用途:给属性设置初始值)。
构造方法,定义格式:
public 类名(数据类型 形参名,...){ //方法体 }
区别:
构造方法不能定义返回值数据类型(但并不意味着他无返回值),方法名必须为类名
普通方法必须设置返回值数据类型,方法名可以设置为类名,也可以不是类名。
只有方法可以带“()”。
若想实例化对象,必须使用构造方法。在没有定义构造方法时,java会提供默认的构造方法(不带任何参数的构造方法),当在类中已经自己定义了一个构造方法时,java中提供的默认的无参数的构造方法不能再使用,该默认方法已经被自己设置的构造方法所替换覆盖。
用途:
实例化对象
为属性赋予初始值。例如:
public Student(String n){ name=n; }
引用传递与值传递:
值传递适用于java的基本数据类型+String
引用传递适用于java的引用类型(对象类型)[类,抽象类,接口,数组 ]
一个new一个新对象。
内存分为“栈”内存和“堆”内存。类被存储在“栈”内存中
new关键字的作用:
在“堆”内存中开辟一个大小由“类”决定的新空间,则该新空间具备一个新的地址。当利用构造方法创建了一个对象A时,该地址被返回给“栈”内存中的类。当再用new和构造方法创建一个对象B时(B与A的对象名相同,如stu),“栈”内存中的类获取了新的地址,再调用stu时,无法调用出A.地址已经被覆盖,已经找不到A的地址。A被GC回收。(即使AB对象名相同,AB被赋予的属性初始值相同。B都是一个新的对象。利用构造方法创建对象时,一个new一个新对象)
GC:销毁对象,释放内存。
new关键字的作用:在内存中开辟一个新的空间。
构造方法作用:在内存中创建一个对象,赋予其初始值
例如:
Student stu=new Student("张三"); stu=new Student("张三"); Student stu=new Student("张三"); //这三个“stu”均为不同的对象。 stu1.setName("张三");//用是stu1的地址在“堆”内存中调用study的方法。 stu2.setName("李四");//对象里存储的是对象在内存空间的首地址!!! stu3.setName("王五");//创建一个对象,该对象就相当于一个指针,类似,但不是指针。 //当进行如下操作时 stu2=stu1; stu1=stu3; stu3=stu2; //当调用时 stu1.getName(); stu2.getName(); stu3.getName(); //结果为 王五 张三 张三
方法重载(普通方法和构造方法都可以)
构造方法的重载(用于创建对象):看该对象需要有怎样的参数,要创建的对象与对象之间存在不同时(例如:生活中在制作电脑时,有些不需要摄像头,有些需要摄像头,这个时候需要用到方法重载。)需要使用构造方法的重载
this关键字:参数名和属性名相同时,就近原则(参数近于属性),相当于参数的值赋给参数。例如:
public Student(String name){ name=name; }
则最后调用属性时,显示“null”(因为属性无赋值);
修改方法:1、修改参数名
2、在属性名前加上“this.”
//this的第一用途。当属性名和参数名相同时,用于区分属性和参数
this的第二用途:
public Student(){ this("aaa");//表示调用当前类中带有字符串的构造方法。 //只有这种格式允许在创建对象时调用多个构造方法 }
this表示当前对象。当在stu1对象中调用对应方法时,this表示stu1.
当再创建一个对象stu2时,在stu2对象中调用对应方法时,this表示stu2。
代码示例:回合制游戏:**角色和男爵Boss进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!
**角色和小怪进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!
public class Boss{ //定义Boss类 //定义属性 private String name; private int hp; //定义构造方法 public Boss(String n,int h){ name=n; hp=h; } //定义普通方法 //定义设置姓名的方法 public void setName(String n){ name=n; } //定义获取姓名的方法 public String getName(){ return name; } //定义设置血量的方法 public void setHp(int h){ hp=h; } //定义获取血量的方法 public int getHp(){ return hp; } //定义攻击Fighter的方法 public void fight(Fighter f){ System.out.println(getName()+"对"+f.getName()+"造成了8点伤害"); f.setHp(f.getHp()-8); } }
public class Soldier{ //定义Soldier类 //定义属性 private String name; private int hp; //定义构造方法 public Soldier(String n,int h){ name=n; hp=h; } //定义普通方法 //定义设置姓名的方法 public void setName(String n){ name=n; } //定义获取姓名的方法 public String getName(){ return name; } //定义设置血量的方法 public void setHp(int h){ hp=h; } //定义获取血量的方法 public int getHp(){ return hp; } //定义攻击Fighter的方法 public void fight(Fighter f){ System.out.println(getName()+"对"+f.getName()+"造成了3点伤害"); f.setHp(f.getHp()-3); } }
public class Fighter{ //定义Fighter类 //定义属性 private String name; private int hp; //定义构造方法 public Fighter(String n,int h){ name=n; hp=h; } //定义普通方法 //定义设置姓名的方法 public void setName(String n){ name=n; } //定义获取姓名的方法 public String getName(){ return name; } //定义设置血量的方法 public void setHp(int h){ hp=h; } //定义获取血量的方法 public int getHp(){ return hp; } //定义攻击Boss的方法 public void fight(Boss b){ System.out.println(getName()+"对"+b.getName()+"造成了10点伤害"); b.setHp(b.getHp()-10); } //定义攻击小怪的方法 public void fight(Soldier s){ System.out.println(getName()+"对"+s.getName()+"造成了15点伤害"); s.setHp(s.getHp()-15); } }
public class Fighting{ //主函数,程序的入口 public static void main(String[] args){ //创建新对象,并赋予初始值 Fighter fig=new Fighter("陆逊",100); Boss bos=new Boss("姜维",100); Soldier sol=new Soldier("敌兵",100); java.util.Random r=new java.util.Random(); //调用各自战斗方法进行战斗 //利用随机函数,使Fighter与Boss和Soldier相遇,遇到Boss的几率为1/3, //遇到Soldier的几率为2/3 int a=r.nextInt(3); if(a==0){ //当两者血量都大于0时,继续战斗 while(bos.getHp()>0&&fig.getHp()>0){ fig.fight(bos); bos.fight(fig); } //一方血量小于0时,输出结果 if(bos.getHp()<0){ System.out.println(bos.getName()+"战败,"+fig.getName()+"胜利"); }else{ System.out.println(fig.getName()+"战败,"+bos.getName()+"胜利"); } }else{ //同上 while(sol.getHp()>0&&fig.getHp()>0){ fig.fight(sol); sol.fight(fig); } if(sol.getHp()<0){ System.out.println(sol.getName()+"战败,"+fig.getName()+"胜利"); }else{ System.out.println(fig.getName()+"战败,"+sol.getName()+"胜利"); } } } }
相关推荐
- **通过`new`关键字**:创建新对象时,我们使用`new`关键字后面跟着类名和括号,括号内可以传递构造方法所需的参数。 - **通过子类的构造器**:子类在构造过程中,可以使用`super()`调用父类的构造方法,确保父类的...
最后,方法参数的传递涉及到值传递和引用传递的概念。在Java中,所有的参数传递都是按值传递,也就是说,方法接收的是变量的副本,而不是变量本身。这意味着,即使方法内部改变了参数的值,也不会影响到方法外部的...
3. **参数传递的意义**:向基类构造函数传递参数使得我们可以根据派生类实例化时的具体条件来设置基类的状态。这有助于保持代码的灵活性和可扩展性,因为基类的行为可以根据派生类的特性进行调整。 4. **封装和抽象...
本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递。在编程中,当我们调用一个函数或方法时,我们可以向其提供一些值,...
但如果父类中没有无参构造方法,或者需要在子类中传递特定参数到父类构造方法,则需要使用`super()`关键字显式调用父类的构造方法。 #### 六、构造方法调用的顺序 在类的继承结构中,构造方法的调用顺序遵循自底...
当创建`Person`对象时,内存分配会涉及为对象分配空间,并根据传递的参数调用构造方法,将这些参数赋值给相应的成员变量。 内存分配在Java中主要发生在堆和栈中。栈内存主要存储基本类型的变量和对象引用,而堆内存...
了解View的构造方法及其参数对于优化布局加载和理解Android系统的工作原理至关重要。本文将深入解析`Android view构造方法第3个参数详解 demo`,并提供相关的实践示例。 首先,我们来看一下View类的主要构造方法: ...
在Silverlight应用开发中,参数传递是常见的需求,特别是在父窗体与子窗体之间通信时。本文档将深入探讨Silverlight中如何有效地传递参数,以便于理解和实现更复杂的交互功能。 首先,让我们理解什么是Silverlight...
- 为了在创建对象时传递初始数据,我们可以定义带参数的构造方法。这样,我们可以根据传入的参数来设置对象的状态。 - 带参数的构造方法可以有多个,只要参数列表不同,它们就不会冲突。 4. **构造方法的重载**:...
在Qt框架下,开发C++应用程序时,我们经常需要在不同的窗体...在实际应用中,通常会结合以上方法,根据需求选择合适的方式进行窗体间的参数传递和调用。理解这些基本概念和技术,能帮助你构建更加复杂的Qt应用程序。
本文将详细介绍几种常用的在WinForms中实现窗口间参数传递的方法,并给出具体示例。 #### 二、使用静态变量实现参数传递 一种常见的方法是通过定义静态变量来进行数据共享。这种方法虽然简单,但在实际应用中可能会...
构造方法可以有参数,这样就可以在创建对象时传递初始值。例如,如果我们有一个名为`Circle`的类,用于表示圆,我们可以定义一个带有半径参数的构造方法: ```java public class Circle { float radius; // 带...
构造函数与参数传递 构造函数是在创建对象时调用的一种特殊方法,用于初始化对象的状态。在这个例子中,我们定义了一个带有参数的构造函数,用于接收用户输入的圆的半径值,并将其赋值给类的成员变量`radius`。 `...
根据给定文件的信息,我们可以提炼出以下几个...通过以上知识点的梳理,我们可以更好地理解Java中对象的创建、使用及其在内存中的分布情况,以及如何有效地处理方法调用时的参数传递问题和避免常见的空指针异常等问题。
描述中的"论构造方法的方法论"进一步强调了该内容将从理论和实践两个层面来探讨构造方法的设计和应用。 首先,我们要理解构造方法的基本概念。构造方法是一种特殊的方法,它在创建对象时自动调用,用于初始化新创建...
以上是C#中跨窗体参数传递的几种常见方法。选择哪种方法取决于具体的应用场景,例如,如果数据需要长期保存,使用静态类可能更合适;如果只是临时传递,构造函数或事件驱动编程可能更为简便。在实际开发中,要根据...
在实际项目中,我们经常需要在初始化控制器时传递依赖,这就是构造注入发挥作用的地方。构造注入是一种依赖注入(Dependency Injection, DI)模式,它允许我们在创建对象时传入依赖,而不是让对象自行查找或创建它们...
二、参数传递 在创建线程时,我们常常需要向线程传递参数以便它能执行特定的任务。在 Delphi 中,我们可以通过重写 TThread 的 Execute 方法来接收和使用这些参数。Execute 方法是线程运行的核心,通常在这里处理...
在C#编程中,"不同窗体参数传递"是一个关键概念,它涉及到用户界面(UI)交互和数据在多个窗口或对话框之间的通信。在Windows Forms或WPF应用程序中,我们经常需要在不同的窗体之间传递数据,以实现功能的连续性和用户...
### Silverlight参数传递 ...在Silverlight应用中,合理选择参数传递的方法对于构建高效、稳定和易于维护的应用至关重要。通过采用上述推荐的做法,可以有效地解决全局变量带来的问题,并提高应用程序的整体质量。