9月1号,我正式开始了 Java基础学习 ,之前也经历了一些心路历程吧,到现在已经上了三次课了,首先真的要感谢宇哥的细心讲解,接触的概念理解得很快,当然也有自己接触过C和python的原因吧,接下来一定要心沉下来踏踏实实地敲代码! 今天正式开始我的第一篇技术博客,我把它放到Java专栏中,相信未来还有更多的专栏推出,拭目以待。古人有曰:“吾日三省吾身”,第一次写技术类的可能写得不太好,尽量按照自己的理解去写,欢迎大家留言讨论,更多的是给自己的一次知识回顾,帮助自己建立一个知识体系,就是要时常总结自己。那开始今天的内容吧!
在介绍出类与对象之前,有必要先弄清楚编程语言的面向过程与面向对象,我感觉就是编程思路的问题,不能简单地以使用函数还是类来区分。 面向过程:当你遇到一个问题,你会分析这个问题,然后把问题拆分成一个个步骤,先干什么后干什么,然后根据这个步骤来编程。比如你去超市买东西,步骤为:1.从众多商品中找到你想要的 2.拿出手机支付宝付钱 3.收银台找到商品价格 4.从你支付宝扣钱 面向对象:当你遇到一个问题,你会把问题拆分成一个个对象,1.你和超市(这时超市相当于一个商人)2.超市里的商品 3.支付系统 ,这时候步骤会变成这样,第一类对象确认选择的商品并告知第二类对象,第二类对象知道商品后确认商品价格告知给第三类对象,第三类对象确认是否支付。 经过以上分析,接下来就开始介绍类与对象
对象:首先世间万物皆是对象,你我都是一个对象,桌子、椅子、马路上的一辆车也是对象。简单来说,就是具体的事物,每个对象有自己独有的属性、行为、方法,在程序中由类创建在内存中,程序结束后自动删除。当然对象间也有相同的属性、行为、方法,就引出接下来的类。 类:上面所说的你我就同属于一个类(人类),尽管我们性格不一样,但都有相同的生活习性,简单说就是 具有相同属性、特征、行为方式、功能的一类事物的集合,可以想象成一个具有相同属性的一个模板。 类好比一张房子图纸,根据这张图纸造出的房子就是一个个对象,但最后房子内部装修肯定是不一样的。
java中类与对象的编写 类
// 关键字 class public class LeiMing{ // 类名采用驼峰命名法,每个单词首字母都大写 //属性格式:属性类型 属性变量名 String name;//其中String在源代码中是一个类,只要是一个Class就可以作为一种类型存在 int wj; }方法(函数):行为、功能的描述
public 返回值类型 方法名(参数类型 参数变量名){ //返回值类型:有 int/cahr // 空 void 空 // 无 构造方法,没有返回值结构 // 参数:单个:(参数类型 参数变量名) eg:(int i) // 多个:(参数类型1 参数变量名1,参数类型2 参数变量名2,...) }方法重载:根据参数多少可以构造方法名一样但参数不一样的多个方法 ,参数一样的话程序会报错 方法重写:将在继承之后介绍
以英雄联盟中的英雄写一个类:
public class Hero{ String name; int ad; int ap; int hp; int FirstSklill; public void Restore(){ System.out.println(name+"每秒回复5点生命值与2点法力值"); } //方法重载 public void Restore(int i){ System.out.println(name+"每秒回复5点生命值与”+i+”点法力值"); } }用类构造对象
//关键词 new //格式:类名 对象名 = new 类名(); public class Pk{ Hero hanbing = new Hero(); }那么怎样让程序运行起来执行我们写的方法呢 程序入口:主方法
//一个程序每次只能启动一个 //一个类中只能写一个 public static void main(String[] args){ //输出语句 System.out.print("你好啊"); // 下次输出时自动换行 System.out.println("你好啊"); }来,试一下
public class Pk{ public static void main(String[] args){ Hero hanbing = new Hero(); hanbing.name = "寒冰射手"; hanbing.Restore();//无参数 hanbing.Restore(10);//有参数 } } 寒冰射手每秒回复5点生命值与2点法力值 寒冰射手每秒回复5点生命值与10点法力值那么子类以及子类对象可以调用父类的哪些属性和方法呢?这就要讲一下访问修饰符 访问修饰符 (权限限定修饰词) 1.公共的 2.私有的 3.受保护的 4.默认的 先给出结论:
同包中: 除私有的属性和方法外都可以调用 不同包中: 1、在子类中,可以调用父类的公共的和受保护的, 2、在非子类中,子类对象只能调用公共的 3、不同包中,受保护的属性只能由子类访问,父类自己也不可以接下来我们完善一下之前写的Hero类
package com.wj0901; public class Hero { public String name; //公共的 public int ad; public int id; public int hp; public int FirstSkill; private int siyou; //私有的 protected int pro;//受保护的 int moren;//默认的 public void Restore() { System.out.println(name+"每秒回复5点生命值与2点法力值"); } public void Restore(int i) { System.out.println(name+"每秒回复5点生命值与"+i+"点法力值"); } }方法重写
子类中可以将父类的方法进行重写 、即存在继承关系
格式:除方法体之外的皆与父类方法一致
子类对象优先调用重写之后的方法
在父类的方法功能不满足子类的需求时可重写父类的方法
关键字 super 在方法重写中指代父类 形式可以是三种:
1、将父类的方法进行修改 2、在父类的基础上进行代码增加,保持父类方法的不变 3、将父类的方法内容删除 重写自己的之后我们在同包中创建德玛和寒冰这两个类,可直接继承Hero这个类,Hero这个类里包含基础的属性:name、ad、ap、hp、一技能,在德玛和寒冰这两个子类中可以写自己的方法或重写父类的方法。
看代码
package com.wj0901; public class Dema extends Hero { //攻击HanBing int q; // 子类独有的属性 public void Restore() { super.Restore(); System.out.println(name+"每秒回复10点生命值"); } }自动转型 先来看看强制转型
int i = 1.2; int i = (int)1.2;自动转型 :子类对象可以自动转型为父类类型
Hero dema = new Dema;可以看到dema这个对象由Dema类总动转型到了Hero类 子类对象自动转型之后不能调用自己独有的属性和方法,什么意思呢 刚才我们创建Dema这个类时,有一个父类没有的属性int q; 也就是现在dema这个对象不能访问q啦,独有的方法也不能调用。 接下来我们用自动转型给Dema类写一个方法
package com.wj0901; public class Dema extends Hero { //攻击HanBing int q; public void Restore() { super.Restore(); System.out.println(name+"每秒回复10点生命值"); } public void ack(Hero hero) { hero.hp -= FirstSkill; System.out.println(name+"使用一技能攻击了"+hero.name+",使其失去"+FirstSkill+"点hp,并剩下"+hero.hp+"点hp。"); } }代码中的ack(Hero hero)就是一个自动转型,任何传入的子类对象都会被转型为Hero父类。且此子类对象只能调用父类的公共的和受保护的。
再写一个Hanbing类
package com.wj0901; public class Hanbing extends Hero { public void ack(Hero hero) { hero.hp -= FirstSkill; System.out.println(name+"使用一技能攻击了"+hero.name+"使其失去了"+FirstSkill+"点hp,还剩下"+hero.hp+"点hp。"); } }在不同的包中创建Karsa子类
package com.wj0902.Extends; public class Karsa extends com.wj0901.Hero { public void Restore() { System.out.println(name+"每秒回复7点生命值与5点法力值"); } public void ack(com.wj0901.Hero hero) { hero.hp -= FirstSkill; System.out.println(name+"使用一技能攻击了"+hero.name+",使其失去"+FirstSkill+"点hp,并剩下"+hero.hp+"点hp。"); } }其子类对象只能调用父类中公共的属性。
然后写一个Pk类让这两个子类对象用一技能PK一下;
package com.wj0901; public class Pk { public static void main(String[] args) { //创建对象 Hanbing hanbing = new Hanbing(); //构造对象 hanbing.name = "寒冰射手"; hanbing.ad = 20; hanbing.hp = 600; hanbing.FirstSkill = (int)(200+0.5*hanbing.ad); Dema dema = new Dema(); dema.name = "德玛西亚之力"; dema.ad = 20; dema.hp = 600; dema.FirstSkill = (int)(150+0.8*dema.ad); //调用方法 hanbing.ack(dema); dema.ack(hanbing); } } 寒冰射手使用一技能攻击了德玛西亚之力使其失去了210点hp,还剩下390点hp。 德玛西亚之力使用一技能攻击了寒冰射手,使其失去166点hp,并剩下434点hp。到此,类与对象、继承就写完了,其实自己努力想把它们介绍清楚,其中也局限于自己目前的认知水平与能力,但来日方长,以后有什么新的想法和启发会继续完善,欢迎批评指教。