文章目录
今日提要:类和对象(什么?你说你没对象!?去去去,别打岔,我这对象不是你那个对象,你那个自己去找,我这不管跑媒拉纤!!!!)
那问题来了,这里的对象又是什么呢?怎么获得呢?那就好好学吧,没准还真能找到你那个对象呢,很老很老的话说么:“书中自有颜如玉么”
老规矩,有请我们的“hello”闪亮登场:
public class Hello {//类
public static void main(String[] args) {//方法
System.out.print("Hello Java");//语句
}//end main()
}//end class
第二天的学习中,我们已经非常非常简单的了解了什么是类,以及类的结构,但是类在Java中是个很重要的概念,并且贯穿始终;
看出我们的“hello”有什么问题了么?其实这段代码本身并没有什么问题,但是如果我们只是把解决问题的过程用语句记录下来,并依次执行,毫无疑问,这是面向过程的,而Java是完全面向对象的,而面向对象是能够最大限度的减轻程序修改所带来的对源程序的损害,也能够为程序片段的复用和协同工作提供最大的便利(这是我的理解,因为是边学边写的,理解的有偏差的时候,请指正和理解);
把我们的“hello”先修改一下
public class BeginnerHello {//公共类
public static void main(String[] args) {//main方法
Hello h = new Hello();//创建对象
h.helloP();//调用方法
}//end main
}// end public class
class Hello{//hello 类
void helloP () {//helloP方法
System.out.println("Hello Java");//输出“Hello Java”
}//end helloP
}//end class Hello
这段程序和我们的“hello”输出结果是一样的,但这一次,却是一个最基本的面向对象的结构,而不是面向过程的,可能你就要说了,这不是更复杂,需要更多的代码支持了么?你说的也没错,如果你只是写一个规模很小,参数很少,复用率很低的程序,那么面向对象就会显得很笨拙,但是,如果你输出的结果需要根据大量的参数进行变更,程序片段复用率极高,多人协作的时候,面向对象明显会让你的程序变得更加健壮,更加高效,休假的时间没准也更多(不可能的,黑心老板不会让你休假的…不过么,你可以有更多时间摸鱼,有没有诱惑呢?)
言归正传,现在开始讨论我们今天要学习的知识
一、类
概念:类是什么?具有相同属性的客观实例的抽象(真的是够抽象的,我很想抽…算了,平和平和);
咱们还是换人话说吧,人就是一个类,有脑袋身子胳膊腿,你就知道他是个人(此时我家的狗子从我身边缓缓走过),这个么,你知道我说的是什么了,没那么严谨;人是类,男人也是类,女人也是,猫是类,狗也是类,蔬菜水果等等都是类,它们都是某一类具有相同属性的客观实例的抽象;
你又要说了,你这个“hello”明显不是一个类么;
那我现在除了“Hello Java”以外,我还要输出“Hello 张三”、“Hello 李四”、“Hello 王五”、“Hello 赵六”、“Hello 刘二麻子”…呢?
我们再来改改“hello”
public class BeginnerHello {
public static void main(String[] args) {
String [] hx = new String[] {"张三","李四","王五","赵六","刘二麻子","Java"};
Hello h = new Hello();
for (int i = 0; i < 6; i++) {
h.helloP(hx[i]);
}
}//end main
}// end public class
class Hello{
void helloP (String hTemp) {
System.out.println("Hello " + hTemp);//输出“Hello ...”
}//end helloP
}//end class Hello
此时的“hello”就变成了“Hello 张三”、“Hello 李四”、“Hello 王五”、“Hello 赵六”、“Hello 刘二麻子”、“Hello Java”这一小堆客观实例的抽象了,甭管要“hello”谁,都要有“hello”,在这个基础上如果你还想“hello”别的什么,你只需要添加你想要的参数就可以了,而且,我说的是而且啊,如果不想“hello”了,你想“kick”了,也只需要把方法helloP(println …)里面的“Hello”,改成“Kick”,即可,是不是很方便?
这里出现了一个新的语句:
String [] hx = new String[] {“张三”,“李四”,“王五”,“赵六”,“刘二麻子”,“Java”};
这是创建一个数组,对,它很像一个对类的调用,因为实际上就是对类的调用,不过这个类特殊,属于内部类而已
我们来说一下几种数组的创建语句:
int [] x = new int[] {1,2,3,4,5};//创建一个整型的数组,数组含有,1,2,3,4,5个值
int [] x = new int[5];//声明一个整型数组,一个含有5个整型数的数组,默认值为0
char [] x = new char[] {‘a’,‘b’,‘c’,‘d’}//一个字符型数组
也就是说你可以创建一个有初值的数组,也可以声明一个没有初值的数组,但是没有初值的数组,你必须声明数组的大小,没有初值的数组不代表没有值,整型默认值为0,字符串默认值为null,布尔类型的默认值为false大致就是这样。
现在我们来说说一个类到底是什么样子的吧:
由上至下,我们依次分为类名、实例变量、方法,下面,我们依次简单的解说一下这各个部分
1.类名
一个类必须要有类名的,类名是未来程序调用类的基本参数,这个命名一定要易读(最起码对你自己来说,嘿嘿),别回来三天以后再看,都不知道这个类是干什么的了;
class MyClass {//创建一个类
}// end class MyClass
一个Java程序源文件里面有几个,几十个甚至几百个类,除了一个公共类的类名和源文件文件名相同外,其他类名都可以根据你的爱好(或者甲方爸爸和老板的爱好编制…)
2.这是啥东西?虽然在类里,但是不在构造方法里面,也不在语句块里,它是谁?它要干啥?
这东西有个标准的名字:实例变量…,这名字真找…抽象;
概念上有个非常简单的概述,实例变量里的实例等同于对象,实例变量也就是对象的初始变量参数或者更准确的说是对象的状态,属于对象已知的参数,看完这个解释,吓得我去听了一遍忐忑,终于能不忐忑了。平静下来的我,用小白的眼光重新审视了这个找…抽象的实例变量;
我给了自己一个比较容易理解的解释:
[1].不是类里必须的,可以有可以没有,看需要;
[2].如果你的类里有需要贯穿整个类的变量或参数,那恭喜你,你可以有这个实例变量*(先略过对象和封装的问题,我只是觉得这样解释和理解比较容易)*,这样说可能还不太好理解,那我们举个栗子
class 学生{
String 校名;
String 班级;
string 学生姓名;
int 学生年龄;
void 学生成绩(){
}
int 返回学生排名(){
return 排名;
}
}
这不是一个合法的Java程序,这不是一个合法的Java程序,算了不说第三遍了,这个就是个栗子
我们有了一个学生类,然后我们有了学生成绩和学生排名两个方法,可能会有更多的方法,你就当他有就好了,而这些方法都会或多或少的都会用到上面的那些变量,这些变量能够贯穿这个类,这些变量就可以放在这里统一声明,然后大家一起用就好了。首先声明这个解释不太对,甚至是不对,但是在这个阶段可以让我少听几遍忐忑,并且可以理解它存在的意义和用途我觉得就算达到目的了,对于一个初学的小白来说,用人话来解释还是有一定的难度的。
实例变量也是有初值的,默认初值也是:整型默认值为0,字符串默认值为null,布尔类型的默认值为false,实例变量属于该类的对象的(对,就是他媳妇的,呸呸呸,满脑子都想的什么),只有该类的对象才能调用实例变量,记住这句话就好了,一会说到对象的时候,我再想办法翻译成人话。
3.方法
其实说是方法,我觉得还是太概括了,要我说,应该这么说,看我这个类,能鼓捣什么,能折腾什么…呃,我忐忑听多了,方法么,其实就是一个类能做些什么的行为。方法里大量存在的就是语句了,也就是那些可以被重复利用的语句片段了,这个应该不难理解了。
方法我们现阶段能接触到的,也就是无参无返回值的,无参有返回值的,有参的无返回值的,有参有返回值的,第二天的学习里面也说过都是什么样子的了,就不复述了。
以后还会碰到什么构造函数,匿名构造块等等吧,用到再说也不迟,有个概念就行了。
二、对象(重头戏来喽)
重头戏不代表字数很多哦,只是说,很重要,因为这个卡了我好一会呢,不知道别的人学习的时候会不会在这里卡住。
1.类与对象的关系
第一句话:类不是对象;
第二句话:对象由类构造;
好了,我说完了,下课…咦?!这是谁的拖鞋?呀!又一只,为啥是一顺的呢,哎,两个单身狗拖鞋,好了好了,不要扔了,我没打算出去卖一顺的拖鞋,虽然也是个商机,不过可能会挨打,还是算了。
那就先不下课了,不过你听得懂听不懂,我可不管。
2.类不是对象,对象由类构造
更准确的说类是对象的蓝图和模板;对象是类的实例化;这是概念化的解释
下面说我的理解:我把类想象成一个容器,里面有一副人类骨架,实验室那种,都见过吧,还有各种填充骨架的物料(实例变量),还有一套系统用以控制行为(方法),对象赋予了类里各个参数的数值,比如头发多长,眼睛多大,身上有多少肉等等吧,根据这些数据我们就开始在骨架上捏人,到此为止,类就已经实例化了,他就形成了一个具象的某个人了,这时就已经变成我们可以操作的对象了,而我们创造对象的用途,是用来作出各种动作及反应的,所以这个实例是需要有行为的,这个时候,方法就登场了,方法的主要作用就是让这个实例完成要求的各种行为及反应,有时也需要反馈一些信息。
3.类和对象到底在程序里是什么样的
类我们见过很多次了
class MyClass{//这是MyClass类
}
这个类的对象是什么样的呢,看下面
MyClass xx = new MyClass();//创建了基于MyClass类的对象
继续看我们的实例,我相信无论何时学习何种程序语言,除去一开始那些需要背下来的基础知识外,大量模拟战,才是王道
public class BeginnerTestDog {//创建一个公共类
public static void main(String[] args) {//main()函数
//依据DogClass创建一个名为one的对象
DogClass one = new DogClass();
one.size = 15;//身长
one.weight = 3;//体重
one.breed = "泰迪";//品种
one.name = "黑漆漆";//名字
one.dogReaction();//调用方法
//依据DogClass创建一个名为two的对象
DogClass two = new DogClass();
two.size = 80;
two.weight = 60;
two.breed = "金毛";
two.name = "老牛牛";
two.dogReaction();
}//end main
}//end class
class DogClass{
int size;//身长
int weight;//体重
String breed;//品种
String name;//名字
void dogReaction() {
String bark = "汪汪汪";
//判断狗的叫声
if (weight <= 5) {
bark = "歪歪歪";
}else if(weight > 5 && weight <= 15) {
bark = "汪汪汪";
}else if(weight > 15 && weight <= 30) {
bark = "汪呜汪呜汪呜";
}else if(weight > 30) {
bark = "嗡呜嗡呜嗡呜";
}//end if
//输出结果
System.out.println("一只身长 " + size + " 公分,体重 " + weight + " 公斤,名叫 " + name +" 的 "+ breed + " 正在 " + bark + " 的叫着");
}//end dogReaction
}//end DogClass
一句题外话:自己练习的时候,要时刻注意命名规则及注释的清晰度,学习过程是不能偷懒的,只有熟练的掌握,才能在未来收放自如。
我把类想象成一个容器,里面有一副人类骨架,实验室那种,都见过吧,还有各种填充骨架的物料(实例变量),还有一套系统用以控制行为(方法),对象赋予了类里各个参数的数值,比如头发多长,眼睛多大,身上有多少肉等等吧,根据这些数据我们就开始在骨架上捏人,到此为止,类就已经实例化了,他就形成了一个具象的某个人了,这时就已经变成我们可以操作的对象了,而我们创造对象的用途,是用来作出各种动作及反应的,所以这个实例是需要有行为的,这个时候,方法就登场了,方法的主要作用就是让这个实例完成要求的各种行为及反应,有时也需要反馈一些信息。
这段话的意思,我想大家看完上面这段程序,就应该能够明了了,这就是我为什么说,模拟战才是王道,大家多找初级的题目练习,不断的重复才能看清本质。
上面这个程序应该能清晰的反应出类和对象的关系了,这个程序为了能直观的表达实例变量和对象的依存关系,所以没有对实例变量进行封装,而在公共类中直接调用了,这是极不安全的。
今天我们在面向对象的大门前推开了一条缝隙,后面的世界变幻莫测,丰富多彩,期盼能早日达到完全推开大门的一天。
标签:JAVA,String,对象,class,实例,end,日志,Hello,第七天 From: https://blog.csdn.net/mycqyjn/article/details/140137778