面向对象

作者: 残月雨纷纷 | 来源:发表于2017-06-14 15:05 被阅读3次

    面向对象=数据+方法
    进一步理解为
    程序=对象+消息传递=(数据+方法)+消息传递

    面向对象
    ————————————————————————

    1,将具有相同属性及行为的一组对象称为类。
    2, 广义上讲,具有共同性质的事物的集合就称为类。在面向对象程序设计中,类是一个独立的单位,它有一个类名,其内容包括成员变量,用于描述对象属性;还包括类的成员方法,用于描述对象的行为。在Java程序设计中,类被认为是一种抽象的数据类型,这种数据类型不但包括数据,还包括方法,这大大扩充了数据类型的概念。
    3,类是一个抽象的概念,要利用类来解决问题,必须用类来创建一个实例化的对象,然后通过对象去访问类的成员变量,去调用类的成员方法来实现程序的功能。
    4, 一个类可以创建多个对象,它们具有相同的属性模式,但可以具有不同的属性值。Java程序为每一个对象都开辟了内存空间,以保存各自的属性值。

    ————————————————————————
    对象
    1, 对象是类实例化后的产物。
    2,对象分为静态特征和动态特征两种。静态特征指对象的外观,性质,属性等。动态特征指对象具有的功能,行为等。
    3,人们将对象的对象的静态特征抽象为属性,用数据来描述,在Java中称之为变量;将对象的动态特征抽象为行为,用一组代码来表示,完成对数据的操作,在Java中称之为方法。
    4,一个对象由一组属性和一系列对属性进行操作的方法构成。

    面向对象
    面向对象

    ————————————————————————
    类的声明
    使用类之前,必须先声明它,才可以声明变量,并创建对象语法例
    [标识符] class 类名称
    {
    //类的成员变量
    //类的方法
    }

    标识符可以是public private protected或者省略这个修饰符。类的标识符可以是访问控制符。Java提供了一系列的访问控制符来设置基于类,变量,方法及构造方法等不同等级的权限,

    访问权限 作用
    默认模式default 在默认模式下,不需为某个类,方法等不加任何修饰符。这类声明的方法和类,只允许在同一个包内是可以访问的
    private私有 这是Java语言中对访问最严格的修饰符。如果一个方法,变量和构造方法被声明为"私有"访问,那么它仅能在当前声明它的类内部访问。类和接口的访问方式是不能被声明为私有的。
    public公有 这是Java语言访问权限最宽松的修饰符。如果一个类,方法和构造方法和接口等被声明为"公有"访问,那么它不仅可以跨类访问,而且允许跨包访问。如果需要访问其他包里的公有成员,则需要事先导入那个包所含所需公有类,变量和方法等的那个包
    protected保护 介于public和private之间的一种访问修饰符。如果一个变量,方法和构造方法在父类中声明为"保护"访问类型,只能被类本身的方法及子类访问,即使子类在不同包中也可以访问。类和接口的访问方式是不能声明为保护类型的。

    类的标识符除了public,protected,private和default这四个访问控制符,还可以是final。关键字"final"有"无法改变的"或者"终态的"含义。一个类一旦被声明为final,那么这个final类不能被继承,因此final类的成员方法没有机会被覆盖,默认情况下类都是default的。在设计类的时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不在被拓展,那么就设计为final类。

    ————————————————————————
    类的组成使用
    1 class Person
    2 {
    3 String name;
    4 int age;
    5 void talk()
    6 {
    7 System.out.println("我是:"+name+",今年:"+age+"岁。");
    8 }
    9 }

    程序首先用class声明了一个名为Person的类,在这里Person是类的名称。
    三四行声明了两个属性(即描述数据的变量)name和age,name为String(字符串)型;age为int(整型)。
    5到8行声明了一个talk()方法——操作数据(如name和age)的方法,此方法向屏幕打印信息。
    ————————————————————————
    静态属性(方法),也就是用static修饰的,还是实例属性(方法)
    举例,有个类C,有静态属性a,静态方法a(),还有实例属性b和实例方法b()
    静态属性的调用:C.a
    静态方法的调用:C.a()
    实例属性的调用
    C c = new C();
    c.b
    实例方法的调用:
    C c = new C();
    c.b();

    ————————————————————————
    属性的使用

    class usingAttribule
    {
        static String a="String  a";
        static String b;
    
        String c="String  c";
        String d;
        //static语句块用于初始化static成员变量,是最先运行的块
        static
        {
            //printStatic()调用相应的方法
            printStatic("静态属性初始值");
            b="String  b";
            printStatic("静态属性修改后的值");
        }
        //输出静态成员变量
        public static void printStatic(String title)
        {
            System.out.println("----"+title+"----");  //title是将自身变成printStatic内内容
            System.out.println("a=\""+a+"\"");
            System.out.println("b=\""+b+"\"");
        }
        public usingAttribule()    //这里是构造方法
        {
            println("所有属性改变前");
            d="string  d";
            println("所有属性改变后");
        }
        //打印所有属性,包括静态成员
        public void println(String title)  //定义公有方法println()用于打印所有属性值,包括静态成员值
        {
            System.out.println("----"+title+"----");
            System.out.println("a=\""+a+"\"");
            System.out.println("b=\""+b+"\"");
            System.out.println("c=\""+c+"\"");
            System.out.println("d=\""+d+"\"");
        }
        public static void main(String args[])
        {
            System.out.println();
            System.out.println("----创建usingAttribute对象----");
            System.out.println();
            new usingAttribule();  //使用new关键词和构造方法usingAttribute()来创建一个匿名对象
        }
    }
    

    ————————————————————————
    对象的声明

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

    Person p;            //先声明一个Person类的对象p。
    p = new Person();    //用new实例化Person的对象p。
    

    简便写法例
    Person p = new Person;

    对象的使用

    对象名称.属性名 //访问属性
    对象名称.方法名() //访问方法

    例 假如访问Person类中name和age属性
    p.name; //访问Person类中的name属性
    p.age; //访问Person类中的age属性

    若想将Person类的对象p中的属性name和age赋值,例

    p.name = "张三";
    p.age = "20"

    如果想调用Person中的talk方法,例
    p.talk(); //调用Person类中的talk()方法

    class Can
    {
        public static void main(String args[])
        {
            Person p=new Person();
            p.name="张三";
            p.age=20;
            p.talk();
        }
    }
    class Person
    {
        String name;
        int age;
        void talk()
        {
            System.out.println("姓名,"+name+"。年龄,"+age);
        }
    }
    

    创建匿名对象

    class Can
    {
    public void talk()
    {
    System.out.println("面朝大海,穿暖花开");
    }
    public static void main(String args[])
    {
    //这是匿名对象,没有被其他对象所引用
    new Can().talk();
    }
    }
    
    “new Can()”是创建匿名对象的意思,所以就用“new Can()”整体
    来作为新构造匿名对象的引用,它访问类中的方法,
    就如普通对象一样使用符号点“ . ”:Can().talk();
    

    匿名对象的特点
    1,匿名对象是没有被其他对象所引用,即没有栈内存指向。
    2,由于匿名对象没有栈内存指向,所以只能使用一次,之后变成无法寻回的垃圾对象,故此会被垃圾回收器收回。


    对象的比较
    对象比较有两种方法1种利用==运算符,==运算符比较的是对象内存地址是否相同;2种是用equals()方法,equals()
    方法比较的是对象内容是否相同。

    class Dui
    {
        public static void main(String args[])
        {
            String a=new String("java");
            String b=new String("java");
            String c=b;
            if(a==b)
            {
                System.out.println("a==b");
            }
            else
            {
                System.out.println("a!=b");
            }
            if(b==c)
            {
                System.out.println("b==c");
            }
            else
            {
                System.out.println("b!=c");
            }
            }
    }
    
    //由于  ==  运算符比较的是内存地址所以a!=b
    
    class Dui
    {
        public static void main(String args[])
        {
            String a=new String("java");
            String b=new String("java");
            String c=b;
            if(a.equals(b))
            {
                System.out.println("a==b");
            }
            else
            {
                System.out.println("a!=b");
            }
            if(b.equals(c))
            {
                System.out.println("b==c");
            }
            else
            {
                System.out.println("b!=c");
            }
            }
    }
    
    //由于equals()比较的是内容,所a==b
    

    对象数组的使用

    我们可以吧类理解为用户自定义的数据类型,他和基本数据类型(如int,float等)具有相同的地位。对象数组存放。声明以类为数据类型的数组变量,并用new分配内存空间给数组。用new产生新的对象,并分配内存空间给它。

    p = new Person[3]   用new分配内存空间
    创建数组以后便可吧数组元素指向由Person类所定义的对象
    p[0]=new Person();
    p[1]=new Person();
    p[2]=new Person();```
    
    
    简便方式
    ```Person p[]=new Person[3]```
    
    **动态初始化数组**
    ```for(inti=0;i<p.length;i++)
    p[i]=new Person();```
    
    **静态初始化数组**
    ```Person p[]={new Person(),
    new Person(),new Person()};```
    
    ----------------------------------------------------------------------
    **用静态方法初始化数组**
    
    

    class Person
    {
    String name;
    int age;
    public Person(String name,int age)
    {
    this.name=name;
    this.age=age;
    }
    public String talk()
    {
    return "姓名:"+name+"。年龄:"+age;
    }
    }
    class Can
    {
    public static void main(String args[])
    {
    Person p[]={
    new Person("张三",20),
    new Person("李四",23),
    new Person("王五",25)
    };
    for(int i=0;i<p.length;++i)
    {
    System.out.println(p[i].talk());
    }
    }
    }

    
    **this关键词**  当创建一个对象后,Java虚拟机就会给这个对象分配一个自身的引用,由于this是和对象本身关联的,所以this只能在类中非静态方法中使用。静态属性和静态方法属于类,他们与具体的对象无关,所以静态属性及方法没有this,同一个类下定义的不同对象,每个对象都有自己的this,虽然豆角this,但指向对象不同
    
    ------------------------------------------------------------------
    **方法重载**
    重载注意事项
    1,方法名称相同。
    2,方法的列表参数不同(参数个数,参数类型,参数顺序,至少有一项不同)
    3,方法的返回值和修饰符不做要求哦,可以相同也可以不同。
    
    

    class Method
    {
    public int can(int a,int b)
    {
    return a+b;
    }
    public float can(float a,float b)
    {
    return a+b;
    }
    public int can(int a,int b,int c)
    {
    return a+b+c;
    }
    public static void main(String args[])
    {
    int i;
    float f;
    Method m=new Method();
    i=m.can(1,2);
    System.out.println(i);
    f=m.can(1.2f,2.3f);
    System.out.println(f);
    i=m.can(1,2,3);
    System.out.println(i);
    }
    }

    
    

    import java.lang.String;
    class Method
    {
    public static void main(String args[])
    {
    byte a=12;
    short b=34;
    int c=56;
    float d=7.8f;

        System.out.println(String.valueOf(a));
        System.out.println(String.valueOf(b));
        System.out.println(String.valueOf(c));
        System.out.println(String.valueOf(d));
    }
    

    }

    
    ----------------------------------------------------------------------
    **构造方法**
    构造方法   就是在每一个类中定义的,并且是在使用关键词new实例化一个新对象的时候默认调用的方法。构造方法主要是对新创建对象的数据成员赋初值。
    
    

    class 类名称
    {
    访问权限 类名称(类型1 参数1,类型2 参数2,……) //构造方法
    {
    程序语句;
    …… //构造方法没有返回值
    }
    }

    
    **构造方法注意**
    1,构造方法名称和其所属的类名必须一致。
    2,构造方法没有返回值,也不可以用void。
    3,构造方法也可以像普通方法一样被重载。
    4,构造方法不能被static和final修饰。
    5,构造方法不能被继承,子类使用父类的构造方法需要使用super关键字。
    构造方法创建对象时就自动“隐式”执行。因此构造方法无需在程序中直接调用,而是对象产生时自动执行一次。通常用它来对对象的数据成员进行初始化。
    
    

    class Test
    {
    public static void main(String args[])
    {
    Person p=new Person(12);
    p.show("java构造方法的使用演示");
    }
    }
    class Person
    {
    public Person(int x)
    {
    a=x;
    System.out.println("构造方法被调用");
    System.out.println("a="+a);
    }
    public void show(String msg)
    {
    //调用这个方法并给msg赋值。打印方法内容
    System.out.println(msg);
    }
    private int a;
    }

    
    ----------------------------------------------------------------------
    **构造方法的重载**
    
    

    class Person
    {
    private String name;
    private int age;
    public Person(int age) //含有一个整型的构造方法
    {
    this.age=age;
    name="张三"; //只提供一个参数,用"张三"初始化name
    }
    //含有一个字符串的参数和一个整型参数的构造方法
    public Person(String name,int age)
    {
    this.name=name;
    this.age=age;
    }
    public void talk()
    {
    System.out.println("姓名,"+name+"。年龄,"+age);
    }
    }
    class Can
    {
    public static void main(String args[])
    {
    Person p1=new Person(20);
    Person p2=new Person("李四",28);
    p1.talk();
    p2.talk();
    }
    }

    
    **无参构造方法使用**
    

    class Can
    {
    public static void main(String args[])
    {
    Person p=new Person();
    p.talk();
    }
    }
    class Person
    {
    private String name;
    private int age;
    public Person()
    {
    name="张三";
    age=20;
    }
    public Person(int age)
    {
    name="张三";
    this.age=age;
    }
    public Person(String name,int age)
    {
    this.name=name;
    this.age=age;
    }
    public void talk()
    {
    System.out.println("我叫,"+name+"。我今年,"+age);
    }
    }
    //Person类是没有参数,所以必须先用无参构造方法,之后在在构造方法添加参数。

    
    ------------------————————----------------------------
    **构造方法的私有使用范例**
    
    

    class Can
    {
    public static void main(String args[])
    {
    //声明一个Person类的对象
    Person p;
    //虽私有化Person类的构造方法,但可以通过Person类公有接口获得Person实例化对象
    p=Person.getPerson();
    System.out.println("姓名,"+p.name);
    }
    }
    class Person
    {
    String name;
    //在本类声明Person对象PERSON。注意对象用final标记,表示对象不可更改
    private static final Person PERSON=new Person();
    private Person()
    {
    name="张三";
    }
    public static Person getPerson()
    {
    return PERSON;
    }
    }

    
    由于Person类构造方法是private,所以如**Person p=new Person()**已经不在行了,只能通过**p=Person.getPerson();**来获取实例,而由于这个实例PERSON是static的,所以全局共享一个,所以无论在Person类外部声明多少个对象,使用多少个**p=Person.getPerson();**。最终得到的实例都是同一个。也就是说,此类只能产生一个实例对象。这种做饭饭叫做**单态模式**,
    
    

    构造方法私有化演示2
    class can
    {
    public static void main(String args[])
    {
    Person p;
    p=Person.talk();
    System.out.println(p.name);
    }
    }
    class Person
    {
    String name;
    private static final Person can=new Person();
    public Person()
    {
    name="张三";
    }
    public static Person talk()
    {
    return can;
    }
    }

    ——           -----------------------------------------------------
    **方法内部调用方法**
    
    

    class Person
    {
    private String name;
    private int age;
    private void talk()
    {
    System.out.println("woshi"+name+"我今年"+age);
    }
    public void say()
    {
    talk();
    }
    public String getAbc()
    {
    return name;
    }
    public void setAbc(String name)
    {
    this.name=name;
    }
    public int getDef()
    {
    return age;
    }
    public void setDef(int age)
    {
    this.age=age;
    }
    }
    class can
    {
    public static void main(String args[])
    {
    Person p=new Person();
    p.setAbc("张三");
    p.setDef(20);
    p.say();
    }
    }

    
    ---------------------------------------------------------------------
    **方法的递归调用**
    
    

    class Person
    {
    //非递归方式实现计算1+2+3……+n
    public int a(int n)
    {
    int b=0;
    for(int i=1;i<=n;++i)
    {
    b+=i;
    }
    return b;
    }
    //递归方式实现计算1+2+3+……n
    public int c(int n)
    {
    //递归出口,当n小于1时函数就会逐层返回
    if(n<=1)
    return n;
    return n+c(n-1);
    }
    public static void main(String args[])
    {
    Person p=new Person();
    //调用非递归计算
    int b=p.a(10);
    System.out.println("非递归计算1+2+3+……+10结果,"+b);
    //调用递归方法计算
    b=p.c(10);
    System.out.println("递归计算1+2+3+……+10结果,"+b);
    }
    }

    相关文章

      网友评论

        本文标题:面向对象

        本文链接:https://www.haomeiwen.com/subject/klosqxtx.html