A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2017-8-25 11:02 编辑

【济南中心】JavaEE基础班新课程day07:面向对象



前情回顾:
【济南中心】JavaEE基础班新课程day01:java概述
【济南中心】JavaEE基础班新课程day02:java基础知识
【济南中心】JavaEE基础班新课程day03:选择和循环
【济南中心】JavaEE基础班新课程day04:随机数和数组
【济南中心】JavaEE基础班新课程day05:方法概述
【济南中心】JavaEE基础班新课程day06:Eclipse断点调试

          雷得死俺的枕头们,各位父老乡亲们,我们黑马程序员JavaEE基础班新课程进行到了day07,马上要迎来咱们的一个重点--面向对象相关的知识,在此之前,我觉得有必要跟大家简单介绍一下前面的剧情。
         绝命毒师.jpg
          Java从1995年诞生以来一直非常火爆,蝉联计算机开发语言榜首多年,java语言一个最大的特点就是它的跨平台性,也就是一个java程序在不同的操作系统都能运行,为什么能做到跨平台?这就要多亏了java虚拟机了,也就是jvm,不同的操作系统可以安装不同的虚拟机这样就相当于把坑坑洼洼的路铺平了,让java程序在不同的操作系统上都畅通无阻。
222.png
         咱们来学习java开发,首先当然是要有合适的工具,也就是要学会搭建开发环境,jdk的安装点下一步就ok,然后配置环境变量,这可是java开发人员的基本功,一定要掌握啊!这里就不做赘述了。
         用java语言编写代码的时候要符合一定的规范,就像我们写信写邮件一样,要符合一定的格式,这个格式既对别人友好,也对自己有帮助。让我们调bug,理思路更加方便。这里除了要保证好漂亮的缩进和注释以外需要更加强调的就是标识符命名规范了。一定要重视哦,这是成为一个专业开发人员所必备的技能。像类名首字母大写 变量名小写等这种规范养成习惯以后,你看到不规范的代码就会感到别扭这说明就养成了一定的代码感。
          代码规范-注释.png
         我们后来从记事本转到了更加高效的Eclipse开发工具,绿色版打开就能用了非常方便,我们学会了创建工作空间,建项目,建包,建类,这样让开发更规范,找东西也更快捷了。
            Eclipse建包建类.png

         有了这样规范的编程习惯,再学习知识就水到渠成,我们不断的学习新的概念,新的案例,动手演示案例,运行出结果验证我们的设想,进步就是这样来的。四类八种数据类型一定要记住。各种运算符的使用是不是会了呢?键盘录入用起来很方便吧?&&和&的区别还记得吗?if else 、for循环、break和continue的区别,数组怎么遍历,如何产生一定范围内的随机数字,方法的重载有什么好处?同学们!这些都是重点啊!(/敲黑板)如果我提到的这些还有回答不上的,赶紧点击上面的链接去复习一下吧!
         1.png

面向对象

       今天我们学习面向对象,java有句名言:万物皆对象。我们定义对象其实也是为了让我们理清开发的思路。比如我要开发一个学校用的图书馆借书系统。我先分析这个系统会涉及到什么物品?  首先当然跟图书有关,那我们就创建一个图书对象。还跟人有关,因为是人要借书,所以要有个学生类。当然还有管理员类。其次就是他们之间的关系了,学生类有特有的功能,查书,借书,还书,如果想做多一点还可以给他加上信用积分,用户等级等其他属性都是可以。这样我们就可以根据这样的逻辑去开发相应的功能了,思路是不是就顺多了?跟我们平时的思考习惯是相同的。
       其实我们学习编程就是为了用代码描述日常生活。比如超市有购物车,那我们淘宝里是不是也有购物车?
       好,说了这么多,到底怎样定义一个类呢?
       类:是一组相关的属性和行为的集合(我们班所有的同学都具备相同的属性和行为,比如:姓名,年龄,学习,这样就把所有的学生成为学生类)

       什么是对象呢?
       对象:是该类事物的具体体现(说某个同学时,他都具备自己特有的属性和行为)
       这里再介绍一些概念:成员变量,成员方法。
       成员变量         和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
       成员方法         和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
代码案例
      
[Java] 纯文本查看 复制代码
public class Student {
        //成员变量
        //姓名
        String name;
        //年龄
        int age;
        
        //成员方法
        //学习的方法
        public void study() {
                System.out.println("好好学习,天天向上");
        }
        
        //吃饭的方法
        public void eat() {
                System.out.println("学习饿了要吃饭");
        }
}
我们定义了一个学生类,大家应该发现了这个类是不能直接运行的,我们这个类是用来创建对象的,最终我们要的是对象,所以我们要写个测试类。
[Java] 纯文本查看 复制代码
/*
 * Student是一个学生事物描述类,main方法不适合放在它里面。
 * 
 * 使用一个类,其实就是使用该类的成员。(成员变量和成员方法)
 * 而我们要想使用一个类的成员,就必须首先拥有该类的对象。
 * 我们如何拥有一个类的对象呢?
 *                 创建对象就可以了?
 * 我们如何创建对象呢?
 *                 格式:类名 对象名 = new 类名();
 * 对象如何访问成员呢?
 *                 成员变量:对象名.变量名
 *                 成员方法:对象名.方法名(...)
 */
public class StudentDemo {
        public static void main(String[] args) {
                //格式:类名 对象名 = new 类名();
                Student s = new Student();
                //System.out.println("s:"+s); //com.itheima_02.Student@193c0cf
                
                //直接输出成员变量值
                System.out.println("姓名:"+s.name); //null
                System.out.println("年龄:"+s.age); //0
                System.out.println("----------");
                
                //给成员变量赋值
                s.name = "林青霞";
                s.age = 28;
                
                //再次输出成员变量的值
                System.out.println("姓名:"+s.name); //林青霞
                System.out.println("年龄:"+s.age); //28
                System.out.println("----------");
                
                //调用成员方法
                s.study();
                s.eat();
        }
}
         
内存空间
我们之前讲过,数据类型有基本数据类型,还有引用数据类型,这里的对象就是引用数据类型,创建一个对象就是让它指向一个堆里面的内存空间,把这个对象的属性和方法存到这个内存里。
        我们再创建一个手机类讲一下内存里怎么存储对象的数据的。
[Java] 纯文本查看 复制代码
/*
 * 手机类:
 *                 成员变量:品牌,价格,颜色...
 *                 成员方法:打电话,发短信...
 */
public class Phone {
        //品牌
        String brand;
        //价格
        int price;
        //颜色
        String color;
        
        //打电话
        public void call(String name) {
                System.out.println("给"+name+"打电话");
        }
        
        //发短信
        public void sendMessage() {
                System.out.println("群发短信");
        }
}

再写个测试类。
[Java] 纯文本查看 复制代码
/*
 * 手机类的测试类
 */
public class PhoneDemo {
        public static void main(String[] args) {
                //创建对象
                Phone p = new Phone();
                
                //输出成员变量值
                System.out.println("品牌:"+p.brand);//null
                System.out.println("价格:"+p.price);//0
                System.out.println("颜色:"+p.color);//null
                System.out.println("------------");
                
                //给成员变量赋值
                p.brand = "锤子";
                p.price = 2999;
                p.color = "棕色";
                
                //再次输出成员变量值
                System.out.println("品牌:"+p.brand);//锤子
                System.out.println("价格:"+p.price);//2999
                System.out.println("颜色:"+p.color);//棕色
                System.out.println("------------");
                
                //调用成员方法
                p.call("林青霞");
                p.sendMessage();
        }
}

2.png
当new Phone();这句代码执行的时候,会在堆内存里开辟一块空间,这时对象的属性是有默认值的,是null

p.brand = "锤子";这行代码执行的时候,就给对象的属性重新赋值为“锤子”,内存中的值就变为了“锤子”

通过打印输出也验证了我们的思路。

两个对象指向同一内存地址

如果两个对象变量指向同一块内存,里边的数据改变会影响两个对象。
比如:
Phone p1 = new Phone();
Phone p2 = p1;
p1.price = 2000;
这时打印  p2.price 输出也是2000
原因就是内存地址是同一个。

成员变量和局部变量区别

在这里我们接触了一个成员变量,比如phone类中的price 和  brand 变量。
那么成员变量和局部变量有什么区别呢?
成员变量和局部变量的区别:
*      A:在类中的位置不同
*          成员变量:类中,方法外
*          局部变量:方法中或者方法声明上(形式参数)
*      B:在内存中的位置不同
*          成员变量:堆内存
*          局部变量:栈内存
*      C:生命周期不同
*          成员变量:随着对象的创建而存在,随着对象的消失而消失
*          局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
*      D:初始化值的问题
*          成员变量:有默认值
*          局部变量:没有默认值。必须先定义,赋值,最后使用

这些知识要在代码中去体会。

private关键字

这个单词是私有的意思,在这里我们要提一种思想---封装。封装,私有其实是一个意思,就是谁的东西就是谁的东西,不让别人随意修改和调用。
这种做法可以提高代码的安全性。
private在java中称之为修饰符,可以修饰成员变量,也可以修饰成员方法,被private修饰的成员只能在本类中被访问。
[Java] 纯文本查看 复制代码
public class Student {
        String name;
        //int age;
        private int age;
        
        public void setAge(int a) {
                if(a<0 || a>200) {
                        System.out.println("你给的年龄有误");
                }else {
                        age = a;
                }
        }
        
        public int getAge() {
                return age;
        }
        
        public void show() {
                System.out.println("姓名是:"+name+",年龄是:"+age);
        }
}


再写一个测试类。
[Java] 纯文本查看 复制代码
package com.itheima_05;
/*
 * 学生类的测试类
 */
public class StudentDemo {
        public static void main(String[] args) {
                //创建学生对象
                Student s = new Student();
                s.show();
                
                s.name = "林青霞";
                //s.age = 28;
                //s.age = -28;
                //s.setAge(-28);
                s.setAge(28);
                s.show();
        }
}

      我们可以通过s.age = -28;的方式赋值,也可以通过s.setAge(-28);的方式赋值。在目前来看他们区别不大,但是,setAge方法要好一些,因为我们能在setAge方法里面加判断,比如不能传入负数,不能超过140等,加了这些限制就会让我们的程序更合理更安全。

构造方法
我们发现创建了对象,每次都要赋值给他,比如给学生类设置年龄和姓名,这符合我们的日常生活,比如你出生的时候父母肯定要取个名字给你,不能老是叫你宝宝是吧,现在宝宝这么多,大家都是宝宝。就不知道叫的谁了。
我们为了给对象的数据进行初始化就引入了构造方法这个概念,它有这样的特点:
a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值
[Java] 纯文本查看 复制代码
public class Student {
        private String name;
        private int age;
        
        /*
        public Student() {
                System.out.println("这是构造方法");
        }
        */
        
        public Student() {}
        
        public Student(String name) {
                this.name = name;
        }
        
        public Student(int age) {
                this.age = age;
        }
        
        public Student(String name,int age) {
                this.name = name;
                this.age = age;
        }

        public void show() {
                System.out.println(name+"---"+age);
        }
}
我们new 一个对象其实就是调用它的构造方法的过程。我们写Student s = new Student();就是调用空参构造,
我们写Student s2 = new Student("张三",23);就是调用它的有参构造。
这点就是我们之前学的方法的重载。
构造函数里的this.name= name;    this.age = age;这两句代码就是给对象数据初始化的过程,把张三传给了name,把23传给了age,这样这个对象就生动了,s2这个变量就不在是泛指一个学生,而是张三这学生。我们调用它的getName();方法得到的就是张三的名字了。

对于构造方法我们还有个事情要强调,那就是如果我们不写构造方法,那么系统会默认生成一个空参构造,如果我们写了一个有参的构造方法,这时系统不再给我们生成默认空参构造了。所以一般我们都自己写,空参有参都要写。

好了,今天我们学习了面向对象的知识,最后我们做个题练习一下吧!
练习:
     定义“电脑类”Computer,包含以下成员:
           成员属性:
               品牌:brand(String类型)
               价格 : price(double类型)
           成员方法:
               编码coding,调用方法打印  ***电脑正在使用Java语言编程。
               玩游戏,playGame,调用方法打印 ***电脑正在玩王者荣耀。
    创建一个电脑对象,设置品牌为ThinkPad,价格为7399,调用方法coding
    创建一个电脑对象,设置品牌为acer,价格为5399,调用方法playGame

好了!今天的java基础新课程学习就到这里啦!下期见!
5.png



4 个回复

倒序浏览
老师用心了,非常感谢!!
回复 使用道具 举报
消灭0回复~~~
回复 使用道具 举报
回复 使用道具 举报

老师用心了,非常感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马