类和对象的总结

  1、对象是具体存在的具体实体,具有明确定义的状态和行为。

 

类是一个模板,类具有它所有对象相似的特征和行为。

 

  2、程序中的类由两部分组成:属性和方法。属性对应对象的特征,方法对应对象的行为。

 

  3、类的基本格式:

 

  //定义类的格式

 

         public class 类名{

 

                   //属性的定义格式

 

                   数据类型属性名;

 

                   //方法的格式

 

                   public 返回值数据类型方法名(数据类型参数名,...{

 

                   //编写代码处

 

                   }

 

         }

 

  4、实例化对象和调用方法的格式

 

         实例化对象的关键字是new.

 

         格式:

 

                   类名对象名=new 类名();

 

                   Teacher t=new Teacher();

 

         调用方法的格式:

 

                   对象名.方法名(实参,...);

 

                   对象名.属性名=""

 

                   t.setname("张三");

 

                   t.hour=0;

 

                   t.lessons();

 

  5、对象也可以作为参数

 

        

 

eg:

 

Teacher类:

 

特征(属性):姓名,性别,年龄,职称,课程,授课时间……

 

行为(方法):授课,改卷,……

 

 

 

public class Teacher{

	String name;
        int hour;   

	public void setName(String name) {
	this.name = name;
	}

        public String getName() {
                   return name;
         }

         public void setHour(int h){
                   hour=h;    
         }
         public int getHour(){
                   return hour;
         }
         public void lessons(Lesson lesson){//Lesson的对象做方法lessons的参数
                   System.out.print(name+"老师花了"+hour+"小时给学生上"+lesson.getName()+"课。");
         }
}

 

 

 

 

 

如:张三老师花了2小时给学生授课。张三老师就是一个对象。

 

对象特征:名字(张三),授课时间(2小时)

 

对象行为:授课

 

 

 

  6、方法分为:构造方法和普通方法

 

         1)构造方法格式:

 

                   public 类名(数据类型参数名,...{

 

 

 

                   }

 

         eg:  

 

                   //无参构造方法

 

                   public Teacher(){}

 

                   //有参构造方法

 

                   public Teacher(String name){

 

                            this.name=name;

 

                   }

 

         2)构造方法用于创建对象。构造方法可以有参数,也可以无参数

 

         3)构造方法和普通方法的区别:

 

            构造方法只和new关键字搭配使用,创建一个对象,而且它只能  在构造函数中被调用,在普通方法中不能调用构造方法;

 

            普通方法不和new搭配使用,对象可以调用普通方法。

 

 

 

  7、方法重载

 

         1)对于同名的方法,它的数类型、参数个数、参数顺序至少有一个不同。普通方法和构造方法都可以进行方法重载。

      

    生活中的例子,比如:

 

李明去吃晚饭,可以先吃饭后吃菜,也可以先吃菜后吃饭,也可以只吃菜。

 

写字(铅笔,钢笔){}

写字(铅笔){}

     学习(视频,书){}

学习(书,视频){}

 

         2)重载的条件:在方法名相同的前提下,参数类型、参数个数、参数顺序至少有一个不同。

 

         eg:

 

                  

public Teacher(int hour,String name){
	this.hour=hour;
	this.name=name;
                   }
public Teacher(String name){
	this.name=name;
}

 

 

 

         3)调用重载后的方法:调用方法时,在圆括号中写入的实参与形参  的参数类型、参数个数、参数顺序一一对应

 

         eg:

 

                   有两个方法:

 

                   public int add(int a,intb){...}

 

                   public int add(int a,int b,int c){...}

 

                   调用重载后的方法:

 

                   c.add(2,3);

 

                   c.add(2,3,4);

 

 

 

  8this关键字

 

         1this关键字表示的是当前调用方法的对象。

 

         2this关键字有两个用途:

 

         其一:当参数名和属性名相同时,用this可以指向当前调用方法的对象,从而也就区分了参数名和属性名         

 

                   eg:

 

                   public Teacher(String name){

 

                            this.name=name;

 

                   }

 

         其二:可以通过this关键字调用构造方法

 

                   eg:

 

                   public Teacher(String name){

 

                            this.name=name;

 

                   }

 

                   public Teacher(){

 

                            this("张三");//通过this调用构造方法

 

                   }

 

9、参数传递类型分为:值传递和引用传递

 

         1)原始类型:即8大基本类型   byte,int,short,long,char,float,double,boolean,这些类型的数据在调用传递时遵守“值传递”规则。

 

            引用类型:对于引用类型,即类类型(通过类创建的对象的变量名字),这些类型的变量名在调用传递时遵守“引用传递”规则。

 

         2)值传递和引用传递的区别:

 

         值传递:形参类型为原始类型,方法调用时,实参把它的值传递给形参,形参只是用实参的值初始化自己的存储单元内容,实参和形参是两个不同的存储单元,所以方法执行中形参的值的改变不影响实参的值。

 

         引用传递:形参的类型是引用类型,也称传地址。方法调用时,实参是对象(或数组),这是实参和形参指向同一个地址,在方法执行中,对形参的操作实际上就是对实参的操作,这个结果在方法结束后被保留了下来,所以方法执行中形参的改变会影响实参。

 

         类和对象的总结

 

         值传递的例子:

 

 

 

public class Value {
         public static void main(String[] args) {
                  int i=1;
                  valueTest(i);
		  System.out.println("i的值为:"+i);
         }

         public static void valueTest(int i){
                   i=2;
         }

}

 

 

 

结果:i的值为:1

 

 

 

引用传递的例子:

 

public class Student {
	String name;
	
	
	
	public Student() {
		
	}
	public Student(String name) {
		
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

public class Test {

	
	public static void main(String[] args) {
		Student stu1=new Student();
		Student stu2=new Student();
		
		stu1.setName("张三");
		stu2.setName("李四");
		
		stu2=stu1;
		System.out.println("对象stu1的名字为:"+stu1.getName());
		System.out.println("对象stu2的名字为:"+stu2.getName());
	}

}

 结果为:

      对象stu1的名字为:张三
      对象stu2的名字为:张三

分析:当执行stu2=stu1时,对象stu1的首地址赋给了stu2,stu1和stu2此时同时指向了“张三”所在内存空间的首地址.

 

         3String是属于引用传递还是值传递?

 

         String是属于引用传递。Java语言规范规定,String型的变量指向的内存空间是不能被改变的。

 

         eg:

 

       

  public class StringTest {
         public static void main(String[] args) {
                   String strTest=new String("ab");
                   setString(strTest);// 
                   System.out.println(strTest);
         }
         public static void setString(String str){
                   str=str+"c";
         }
}

 

 

结果:ab

 

调用setString()函数时,strTeststr同时指向了”ab”所在的内存单元,然后在setString中试图改变str的值,由于String型的变量指向的内存空间是不能被改变的,所以系统会分配新的内存并令str指向该内存,该内存存储的内容为”abc”,而对于strTest,仍然指向原来的内存单元——“ab”所在的内存单元。这看起来类似值传递,其实,String确实是引用传递。

 

小飞龙(战士)和大魔王(BOSS)PK,可以使用多种技能,每种技能都有对应的攻击力和得分,直到一方血量为0,游戏结束,最后输出:***胜利!***总分为***。

 

public class PK {

	
	public static void main(String[] args) {
		PK pk=new PK();
		Skill [] skill={new Skill(),new Skill("X战火",5,50),new Skill("X战枪",10,100),new Skill("X战剑",8,80)};
		Soldier sol=new Soldier("小飞龙",30,skill);
		Boss boss=new Boss("大魔王",35,skill);
		Random rand=new Random();
		int value=rand.nextInt(2);
		System.out.println(value);
		pk.test(value,sol,boss);		
		}
	public static void test(int v,Soldier sol,Boss boss){	
			switch(v){
				case 0:	
					while(sol.getBlood()>0&&boss.getBlood()>0){
						sol.fight(boss);
						
						if(boss.getBlood()<=0){
							System.out.println(sol.getName()+"胜利!"+sol.getName()+"获得总分数为:"+sol.getSum()+"。"+boss.getName()+"获得总分数为:"+boss.getSum()+"。");
							break;
						}
						boss.fight(sol);
						if(sol.getBlood()<=0){
							System.out.println(boss.getName()+"胜利!"+boss.getName()+"获得总分数为:"+boss.getSum()+"。"+sol.getName()+"获得总分数为:"+sol.getSum()+"。");
							break;
						}	
					}
					break;
				case 1:
					while(sol.getBlood()>0&&boss.getBlood()>0){
						boss.fight(sol);
						
						if(sol.getBlood()<=0){
							System.out.println(boss.getName()+"胜利!"+boss.getName()+"获得总分数为:"+boss.getSum()+"。"+sol.getName()+"获得总分数为:"+sol.getSum()+"。");
							break;
						}
						sol.fight(boss);
						if(boss.getBlood()<=0){
							System.out.println(sol.getName()+"胜利!"+sol.getName()+"获得总分数为:"+sol.getSum()+"。"+boss.getName()+"获得总分数为:"+boss.getSum()+"。");
							break;
						}
					}
					break;
			}
	}
}

public class Soldier {
	private String name;
	private int blood;
	private Skill [] array;
	private int sum;//战士获得的总分数
	
	public Soldier(String name, int blood, Skill [] array) {
		
		this.name = name;
		this.blood = blood;
		this.array = array;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getBlood() {
		return blood;
	}

	public void setBlood(int blood) {
		this.blood = blood;
	}

	public Skill [] getSkill() {
		return array ;
	}

	public void setSkill(Skill [] skill) {
		this.array = skill;
	}
	
	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public void fight(Boss boss){
		Random rand=new Random();
		Skill skill=array [rand.nextInt(array .length)];
		boss.setBlood(boss.getBlood()-skill.getAgressivity());
		sum=sum+skill.getScore();
		System.out.println(boss.getName()+"剩余血量为:"+boss.getBlood()+","+name+"使用技能为:"+skill.getName()+","+name+"获得的分数为:"+skill.getScore());
	}	
}

public class Boss {
	private String name;
	private int blood;
	private Skill [] array;
	private int sum;
	
	public Boss(String name, int blood, Skill [] array) {
		
		this.name = name;
		this.blood = blood;
		this.array = array;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getBlood() {
		return blood;
	}

	public void setBlood(int blood) {
		this.blood = blood;
	}

	public Skill [] getSkill() {
		return array;
	}

	public void setSkill(Skill [] array) {
		this.array = array;
	}
	
	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public void fight(Soldier sol){
		Random rand=new Random();
		Skill skill=array[rand.nextInt(array.length)];
		sol.setBlood(sol.getBlood()-skill.getAgressivity());
		sum=sum+skill.getScore();
		System.out.println(sol.getName()+"剩余血量为:"+sol.getBlood()+","+name+"使用技能为:"+skill.getName()+","+name+"获得的分数为:"+skill.getScore());
	}			
}

public class Skill {
	private String name;
	private int agressivity;//某种技能的攻击力
	private int score;//使用某种技能后所得的分数
	
	public Skill(){
		this("X战水",3,30);
	}
	
	public Skill(String name, int agressivity, int score) {
		this.name = name;
		this.agressivity = agressivity;
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAgressivity() {
		return agressivity;
	}

	public void setAgressivity(int agressivity) {
		this.agressivity = agressivity;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}	

}