java 面向对象

来源:互联网 发布:ubuntu 查看mysql状态 编辑:程序博客网 时间:2024/06/15 04:41

面向对象

1.1    面向对象思想概述及举例

l  概述

n 我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。

n 在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。

n 那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。

n 面向过程的代表语言:C语言

n 当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。

l 面向对象的思想

n 面向对象是基于面向过程的编程思想.

n 面向过程:强调的是每一个功能的步骤

n 面向对象:强调的是对象,然后由对象去调用功能

l  特点

n 是一种更符合我们思考习惯的思想

n 可以将复杂的事情简单化

n 将我们从执行者变成了指挥者

u 角色发生了转换

l  举例

n 买电脑

u 面向过程:我要买电脑--我要明确买电脑的意义--上网查对应的参数信息--去中关村买电脑--讨价还价--买回电脑

u 面向对象:我要买电脑--班长去给我买电脑--买回电脑

n 洗衣服

u 面向过程:把衣服脱下来--找一个盆--放点洗衣粉--加点水--浸泡10分钟--揉一揉--清洗衣服--拧干--晾起来

u 面向对象:把衣服脱下来--打开全自动洗衣机--扔衣服--按钮--晾起来

1.2    类与对象及其使用

l  类与对象关系

n 我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。

n 我们如何表示一个现实世界事物呢:

u 属性         就是该事物的描述信息

u 行为         就是该事物能够做什么

u 举例:学生事物

n 我们学习的Java语言最基本单位是类,所以我们就应该把事物用一个类来体现。

n 类:是一组相关的属性和行为的集合

n 对象:是该类事物的具体体现

n 举例:

u 类             学生

u 对象         班长就是一个对象

l  类的定义

n 现实世界的事物

u 属性         事物的描述信息

u 行为         事物能做什么

n Java中用class描述事物也是如此

u 成员变量        就是事物的属性

u 成员方法        就是事物的行为

n 定义类其实就是定义类的成员(成员变量和成员方法)

u 成员变量:和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。

u 成员方法:和以前定义方法是一样的,只不过把static去掉,面向对象进阶在详细讲解static的作用。

publicclass Student {

    //成员变量

    //姓名

    String name;

    //年龄

    intage;

   

    //成员方法

    //学习的方法

    publicvoid study() {

        System.out.println("好好学习,天天向上");

    }

   

    //吃饭的方法

    publicvoid eat() {

        System.out.println("学习饿了要吃饭");

    }

}

l  对象的创建及其使用

n 创建对象:

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

n 使用对象访问类中的成员:

u 对象名.成员变量

u 对象名.成员方法

publicclass Demo01Student {

    publicstaticvoidmain(String[]args) {

        //创建对象格式:类名对象名 = new类名();

        Student s= new Student();

        System.out.println("s:"+s);//cn.itcast.demo02.Student@100363

       

        //直接输出成员变量值

        System.out.println("姓名:"+s.name);//null

        System.out.println("年龄:"+s.age);//0

        System.out.println("----------");

       

        //给成员变量赋值

        s.name ="赵丽颖";

        s.age = 18;

       

        //再次输出成员变量的值

        System.out.println("姓名:"+s.name);//赵丽颖

        System.out.println("年龄:"+s.age);//18

        System.out.println("----------");

       

        //调用成员方法

        s.study();

        s.eat();

    }

}

l  手机类练习

n 定义手机类

publicclass Phone {

    //品牌

    String brand;

    //价格

    int price;

    //颜色

    String color;

   

    //打电话

    publicvoid call(Stringname) {

        System.out.println(""+name+"打电话");

    }

   

    //发短信

    publicvoid sendMessage() {

        System.out.println("群发短信");

    }

}

n 手机类的测试类

publicclass Demo02Phone {

    publicstaticvoidmain(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();

    }

}

1.3    对象的内存图

l 定义Phone类

publicclass Phone {

    String brand;

    intprice;

    String color;

   

    publicvoid call(Stringname) {

        System.out.println(""+name+"打电话");

    }

   

    publicvoid sendMessage() {

        System.out.println("群发短信");

    }

}

l  一个对象的内存图

publicclass Demo01Phone {

    publicstaticvoidmain(String[]args) {

        Phone p= new Phone();

 

        System.out.println(p.brand +"---" + p.price +"---"+ p.color);

       

        p.brand ="锤子";

        p.price = 2999;

        p.color ="棕色";

       

        System.out.println(p.brand +"---" + p.price +"---"+ p.color);

       

        p.call("林青霞");

        p.sendMessage();

    }

}

 

l  两个引用,指向同一个对象的内存图

publicclass Demo03Phone {

    publicstaticvoidmain(String[]args) {

        Phone p1= new Phone();

        p1.brand ="OPPO";

        p1.price = 2999;

        p1.color ="白色";

        System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);

       

        Phone p2= p1;

        p2.brand ="魅族";

        p2.price = 1999;

        p2.color ="蓝色";

        System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);

        System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);

    }

}

1.4    成员变量和局部变量的区别

l 在类中的位置不同

n 成员变量:类中,方法外

n 局部变量:方法中或者方法声明上(形式参数)

l 在内存中的位置不同

n 成员变量:堆内存

n 局部变量:栈内存

l 生命周期不同

n 成员变量:随着对象的创建而存在,随着对象的消失而消失

n 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

l 初始化值的不同

n 成员变量:有默认值

n 局部变量:没有默认值。必须先定义,赋值,最后使用

publicclass DemoVariable {

    intx;

   

    publicvoidshow() {

        inty = 0;

       

        System.out.println(x);

        System.out.println(y);

    }

}

1.5    封装

l  private关键字由来及其使用

n private关键字:

u 是一个权限修饰符。

u 可以修饰成员(成员变量和成员方法)

u 被private修饰的成员只在本类中才能访问。

public class Student {

    String name;

    //int age;

    privateintage;

   

    publicvoid setAge(inta) {

        if(a<0 ||a>200) {

            System.out.println("你给的年龄有误");

        }else {

            age =a;

        }

    }

   

    publicint getAge() {

        returnage;

    }

   

    publicvoid show() {

        System.out.println("姓名是:"+name+",年龄是:"+age);

    }

}

publicclass DemoStudent {

    public staticvoid main(String[]args) {

        //创建学生对象

        Students = newStudent();

        s.show();

       

        s.name ="柳岩";

        //s.age =18;

        //s.age =-18;

        //s.setAge(-18);

        s.setAge(28);

        s.show();

    }

}

n private最常见的应用:

u 把成员变量用private修饰

u 提供对应的getXxx()/setXxx()方法

u 一个标准的案例的使用

l  成员变量私有的标准代码

Public class Student {

    private Stringname;

    privateintage;

   

    publicvoid setName(Stringn) {

        name =n;

    }

   

    public String getName() {

        returnname;

    }

   

    publicvoid setAge(inta) {

        age =a;

    }

   

    publicint getAge() {

        returnage;

    }

}

Publicclass DemoStudent {

    Public staticvoid main(String[]args) {

        //创建对象

        Student s= new Student();

        System.out.println(s.getName()+"---"+s.getAge());

       

        s.setName("赵丽颖");

        s.setAge(18);

        System.out.println(s.getName()+"---"+s.getAge());

    }

}

l  封装的概述和好处

n 封装概述

u 是面向对象三大特征之一

u 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。就像刚才说的年龄。

n 封装原则:

u 将不需要对外提供的内容都隐藏起来。

u 把属性隐藏,提供公共方法对其访问。

u 成员变量private,提供对应的getXxx()/setXxx()方法

n 好处:

u 通过方法来控制成员变量的操作,提高了代码的安全性

u 把代码用方法进行封装,提高了代码的复用性

1.6    this关键字

l this关键字的由来

n this:代表所在类的对象引用

n 记住:方法被哪个对象调用,this就代表那个对象

l this关键字的使用

n 局部变量隐藏成员变量(局部变量和成员变量重名)

publicclass Student {

    private Stringname;

    privateintage;

   

    publicvoid setName(Stringname) {

        //name = name;

        this.name =name;

    }

   

    public String getName() {

        returnname;

    }

   

    publicvoid setAge(intage) {

        //age = age;

        this.age =age;

    }

   

    publicint getAge() {

        returnage;

    }

}

publicclass DemoStudent {

    publicstaticvoidmain(String[]args) {

        //创建对象

        Student s= new Student();

        System.out.println(s.getName()+"---"+s.getAge());

       

        s.setName("柳岩");

        s.setAge(18);

        System.out.println(s.getName()+"---"+s.getAge());

    }

}

1.7    构造方法

l  作用

n 给对象的数据进行初始化

l  格式

n 方法名与类名相同

n 没有返回值类型,连void都没有

n 没有具体的返回值

修饰符构造方法名(参数列表){

}

l  注意事项

n 如果你不提供构造方法,系统会给出默认构造方法

n 如果你提供了构造方法,系统将不再提供

n 构造方法也是可以重载的

Public class Student {

    private Stringname;

    privateintage;

   

    /*

    public Student() {

        System.out.println("构造方法");

    }

    */

   

    public Student() {}

   

    public Student(Stringname) {

        this.name =name;

    }

   

    public Student(intage) {

        this.age =age;

    }

   

    public Student(Stringname,intage) {

        this.name =name;

        this.age =age;

    }

 

    publicvoid show() {

        System.out.println(name+"---"+age);

    }

}

Publicclass DemoStudent {

    Public staticvoid main(String[]args) {

        //如何调用构造方法呢?

        //通过new关键字调用

        //格式:类名对象名 = new构造方法(...);

        Student s= new Student();

        s.show();

       

        //publicStudent(String name)

        Student s2= new Student("赵丽颖");

        s2.show();

       

        //publicStudent(int age)

        Student s3= new Student(18);

        s3.show();

       

        //publicStudent(String name,int age)

        Student s4= new Student("赵丽颖",18);

        s4.show();

    }

}

l  标准学生类代码编写和测试

n 类

u 成员变量

u 构造方法

l 无参构造方法

l 带参构造方法

u 成员方法

l getXxx()

l setXxx()

n 给成员变量赋值的方式

u 无参构造方法+setXxx()

u 带参构造方法

n 练习

u 学生类(老师讲)

publicclass Student {

    //成员变量

    private Stringname;

    privateintage;

   

    //构造方法

    public Student() {}

   

    public Student(Stringname,intage) {

        this.name =name;

        this.age =age;

    }

   

    //成员方法

    publicvoid setName(Stringname) {

        this.name =name;

    }

   

    public String getName() {

        returnname;

    }

   

    publicvoid setAge(intage) {

        this.age =age;

    }

   

    publicint getAge() {

        returnage;

    }

}

publicclassDemoStudent {

    publicstaticvoidmain(String[]args) {

        //无参+setXxx()

        Student s= new Student();

        s.setName("柳岩");

        s.setAge(18);

        System.out.println(s.getName()+"---"+s.getAge());

       

        //带参构造

        Student s2= new Student("赵丽颖",18);

        System.out.println(s2.getName()+"---"+s2.getAge());

    }

}

u 手机类(学生练)

u 汽车类(学生练)  Car 属性:颜色,品牌,价钱…  功能:行驶