SE -- 面对对象

 

面对对象

面向过程 强调的是功能行为

面向对象 将功能封装进对象,强调具备了功能的对象

面向对象是基于面向过程的。

特点: 是一种符合人们思考习惯的思想 可以将复杂的事情简单化 将程序员从执行者转换成指挥者

完成需求时:先要去找具有所需的功能的对象来用,如果该对象不存在 那么就创建一个具有所需功能的对象 这样简化开发并提高复用

开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情

设计的过程:其实就是在管理和维护对象之间的关系

面向对象的特征:封装 继承 多态

 

类与对象

类:对现实生活中的事物的描述

对象:这类事物,实实在在存在的个体

描述就是class定义的类

具体对象就是java在堆内存中用new建立实体

属性:对应类中的成员变量

行为:对应类中的成员函数

 

class Car
{
    //属性 颜色、轮胎数
    String color = "红色";
    int num = 4;

    //行为 运行行为
    void run()
    {
        System.out.println(color + "..." +num);
    }

}

class CarDemo
{
    public static void main(String[] args)
    {
        //通过new操作符 在堆内存中产生实体 类类型变量指向对象
        //产生了对象 数据类型 对象名 = new 类
        Car c = new Car();
        c.run();
    }
}

 

成员变量和局部变量

成员变量

成员变量定义在类中,在整个类中都可以被访问。

成员变量随着对象的建立而建立,存在于对象所在的堆内存中

成员变量有默认初始化值

局部变量

局部变量只定义在局部范围内,如:函数中,语句内等。

局部变量存在于栈内存中

作用的范围结束,变量空间会自动释放

局部变量没有默认初始化值

 

匿名对象

匿名对象是对象的简化形式

情况:1、当对对象方法仅进行一次调用的时候;2、匿名对象可以作为实际参数进行传递

 

//需求 对汽车进行改装 将来的车改为黑色、三个轮胎
class Car
{
    //定义汽车轮胎数 、颜色
    int num;
    String color;
    void run()
    {
        System.out.println(color + "..." + num);
    }
}

class CarDemo
{
    public static void main(String[] args)
    {
        /*
        Car c1 = new Car();
        show(c1);
        */
        show(new Car());
    }

    //
    public static void show(Car c)
    {
        c.num = 3;
        c.color = "black";
        c.run();
    }
}

 

封装 Encapsulation 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

优势:将变化隔离 便于使用 提高重用性 提高安全性

原则:1、将不需要对外提供的内容都隐藏起来 2、吧属性都隐藏,提供功能方法对其访问

private 私有关键字    

是一个权限修饰符 用于修饰成员(成员变量和成员函数) 被私有化的成员只在本类中有效

常用:将成员变量私有化,对外提供对应的set get方法对其进行访问,提高对数据访问的安全性

 

class Person
{
    private int  age;
    //私有化 需要对外提供方法访问
    public void setAge(int a)
    {
        if(a>=0 && a<=1300)
        {
            age = a;
            speak();
        }
        else
            System.out.println("error age...");
    }
    public int getAge()
    {
        return age;
    }
    void speak()
    {
        System.out.println("age ... " + age);
    }
}

class PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person();
        p.setAge(20);             //age ... 20
    }
}

 

 

 

构造函数

特点:函数名与类名相同 不用定义返回值类型 不可以写return语句

作用:对对象进行初始化

 

class Person
{
    //构造函数
    Person()
    {
        System.out.println("person run....");
    }
}

class PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person();          //person run....
    }
}

 

构造函数是在对象一建立就运行 给对象初始化 而一般方法是对象调用才运行 给对象添加对象的功能

class Person
{
    private String name;
    private int age;
    //构造函数
    Person()
    {
        System.out.println("A:name : " + name + "...age : " + age);
        cry();
    }
    Person(String n)
    {
        name = n;
        System.out.println("B:name : " + name + "...age :  " + age);
        cry();
    }
    Person(String n, int a)
    {
        name = n;
        age = a;
        System.out.println("C:name : " + name + "...age : " + age);
        cry();
    }
    public void cry()
    {
        System.out.println("cry...");
    }
    
}

class PersonDemo
{
    public static void main(String[] args)
    {
        Person p1 = new Person();          //A:name : null...age : 0   cry...
        Person p2 = new Person("wu");      //B:name : wu...age :  0    cry...
        Person p3 = new Person("wu",2);     //C:name : wu...age : 2    cry...
    }
}

注意:1、默认构造函数的特点 2、多个构造函数是以重载的形式存在的

 

1、有默认构造函数

2、自定义的构造函数会替代原有默认构造函数

构造代码块 

{

作用:给对象进行初始化 对象一建立就运行 而且优先于构造函数执行

区别:构造代码块 是给所有对象进行统一初始化 而构造函数是给对应的对象进行初始化

}

对象

this 关键字

this代表其所在函数所属对象的引用

当在函数内需要用到调用该函数的对象时,就用this

 

class Person
{
    private String name;
    private int age;
    //构造函数 局部有name 就在局部中找name this关键字使用 this.name代表对象中的name
    Person(String name)
    {
        this.name = name;
    }
    public void speak()
    {
        System.out.println("name..." + name + "...age..." + age);
    }
}

class PersonDemo
{
    public static void main(String[] args)
    {
        Person p = new Person("wu");
        p.speak();                  //name...null...age...0
    }
}

 

class Person
{
    private int age;
    Person(int age)
    {
        this.age = age;
    }
    //需求 : 比较两个人是否是同龄人
    //结果 boolean 
    //参数 Person p
    public boolean compare(Person p)
    {
        //定义类中功能时 该函数内部要用到调用该函数的对象时 这时用this来表示这个对象
        return this.age == p.age;
    }
}

class PersonDemo
{
    public static void main(String[] args)
    {
        Person p1 = new Person(20);
        Person p2 = new Person(25);
        System.out.println(p1.compare(p2));       //false
    }
}

构造函数之间调用

this语句只能定义在函数的第一行 构造函数之间的调用只能用this()

static(静态)关键字 方法区/共享区/数据区

1、用于修饰成员(成员变量和成员函数)

2、被修饰后的成员具备的特点:随着类的加载而加载; 优先于对象存在 被所有对象所共享;可以直接被类名调用 类名.静态成员

3、注意:静态方法只能访问静态成员 静态方法中不可以写this super关键字(静态优先于对象存在 不可存在) 主函数是静态的

main 函数 作为程序的入口被jvm调用

public 该函数的访问权限最大

static  静态 随着类的加载而已存在

void 主函数没有具体的返回值

main 函数名 被JVM识别

String[] args 函数的参数 参数类型是一个数组 该数组中的元素是字符串 字符串类型的数组

 

public class MainDemo 
{
    public static void main(String[] args) 
    {
        String[] arr = {"aa", "bb","cc","dd"};
        MainTest.main(arr);                                  //aa  bb  cc  dd
    } 
}

class MainTest
{
    public static void main(String[] args)
    {
        for(int x=0; x<args.length; x++)
        {
            System.out.println(args[x]);
        }
    }
}

什么时候使用静态 : 静态修饰成员变量/成员函数

什么时候定义静态变量(类变量):当对象中的出现共享数据,该数据被静态所修饰;对象中的特有数据定义成非静态在堆内存中

什么时候定义静态函数:当功能内没有访问到非静态数据/对象的特有数据,该功能可以定义成静态。

静态的应用--工具类

帮助文档的制作--javadoc javadoc -d 目录 -author -version java文件名 public修饰

注意:一个类中会有一个默认的空参数的构造函数,其权限类型和类的权限类型一致

静态代码块 static {静态代码块执行语句;} 注意:随着类的加载而执行,只执行一次并优先于主函数。用于给类进行初始化

class staticCode
{
    static
    {
        System.out.println("a");
    }
}

class  staticCodeDemo
{
    static 
    {
        System.out.println("b");
    }
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
    static 
    {
        System.out.println("c");
    }
}
/*---------- java ----------
b
c
Hello World!
*/

 

class staticCode
{
    static
    {
        System.out.println("a");
    }
}

class  staticCodeDemo
{
    static 
    {
        System.out.println("b");
    }
    public static void main(String[] args) 
    {
        new staticCode();
        new staticCode();
        System.out.println("d");
    }
    static 
    {
        System.out.println("c");
    }
}
/*---------- java ----------
b
c
a
d
*/
class staticCode
{
    static
    {
        System.out.println("a");
    }
    public static void show()
    {
        System.out.println("e");
    }
}

class  staticCodeDemo
{
    static 
    {
        System.out.println("b");
    }
    public static void main(String[] args) 
    {
        staticCode.show();
        System.out.println("d");
    }
    static 
    {
        System.out.println("c");
    }
}
/*---------- java ----------
b
c
a
e
d
*/

对象初始化过程

对象调用成员过程

设计模式

单例设计模式

 一个类在内存只存在一个对象

posted @ 2018-05-17 00:34  wuyueping  阅读(151)  评论(0编辑  收藏  举报