java面向对象

来源:互联网 发布:sap软件 编辑:程序博客网 时间:2024/05/22 10:29

 面向对象概念

   举例:大象装进冰箱里面。

 

面向过程

 

我们打开冰箱

我们转入大象

我们关闭冰箱

 

对于面向过程思想,强调的是过程(动作)。

代表语言:c语言

 

面向对象

 

对于面向对象思想,强调的是对象(实体)

冰箱打开

冰箱存储

冰箱关闭

 

 C++java c#


特点:

1 。面向对象就是一种常见的思想,符合人们的思考习惯

2   面向对象的出现,将复杂的问题简单化。

3 。面向对象的出现,将曾经的过程中的执行者,变成了对象中的指挥者

 

注:我们就是面向过程的执行者,面向对象的指挥者(指挥new出来的对象执行方法,不用我们自己去执行了)

举例子:

连接支付宝:拿到他们的接口new出一个对象然他来实现所有的方法。

买电脑:带上老师,老师有这功能,去买电脑去让老师去做所有方法,我来指挥,老师去砍价我们不需要知道,主要成功了就可以了。

自己去做也可以,但是太麻烦了,所以要面向对象,不能面向过程。

我们回去要洗衣服做饭,但是我们可以一个对象让她帮我们做做这些事情,如果找不到我们就自己new一个对象出来。

不要再自己做所有事了,自己去找一个对象来做这个功能,如果没有,千万不能自己写这个功能,我们要自己写个具有这功能的类。然后实现类,我能用,别人也能用。

 

 

 

 

面试经常被问你怎么理解面向对象(看你对面向对象的理解程度)

说:上面的三个例子,第一:符合我们现在的思考习惯。第二:让问题变得简单起来,第三:然我们从以前的面向过程的执行者变成了现在的指挥者,其实面试官你就是在用面向对象来思考问题,以你的弄了,你负责一个项目:从开发在写文档,写程序,到测试。一个人能完成,但是特别耗时间,为了提高效率,这时候就要用面向对象的思考方法,去找一些专业的人(对象)来帮你做这些事情,你只要指挥我们做,我们就会给你一个完美的答复,但是你不需要知道我们是怎么做的。万物皆对象不要说,没到那个境界。

 

有对象用对象,没对象造对象,维护各个对象的关系。

 

面向对象三个特征:只有符合这三个特征我们才能说使用了面向对象思想开发。

 

 

人开门?

哪个对象对这个动作最清楚就把该动作定义在该对象上面,

 

1.指挥car动起来

class Car{

   int num;

   String color;

  

   void run(){

            System.out.println(num+"..."+color);

   }

}

 

public class CarDemo

{

         public static void main(String[] args){

                   Car car = new Car();

                   car.num = 5;

                   car.color = "red";

                   car.run();

         }       

}

 

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

 1 成员变量定义在类中,整个类中度可以访问

   局部变量定义在函数中,语句,局部代码块中,只在所属的区域有效。

 

 2 成员变量存在于堆内存的对象中

   局部变量存在于栈内存中

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

   局部变量随着所属区域的执行而存在,随着所属区域的结束而释放(方法结束自动出去,需要再进来,前面已经出现过)

 

 4 成员变量都有默认初始化值,

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

 

 

匿名对象生成后马上就消除,因为没有指向,马上变成垃圾。

New Car().run();

1,当对象对方法仅进行一次调用的时候,就可以简化成匿名对象(因为属性在赋完值以后马上就变成了垃圾)

2  匿名对象可以作为实际参数进行传递。

   Show(newCar());    被使用了就不会马上变成垃圾

 

内存分配图。

 

 

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

   好处: 将变化隔离,便于使用,提高重用性

 

 

 

构造函数

  特点:函数名和类名一样

       不用定义返回值类型

       没有具体的返回值

 

构造函数:创建对象是调用的函数,作用:可以给对象初始化。

     创建函数都要通过构造函数初始化

 

没有定义构造函数,会自己调用空的

定义了构造函数,不会再去调用自己的空的构造方法

 

 

构造函数和一般函数的区别

      构造函数是初始化的时候才调用,

     一般函数是对象创建以后用对象来调用。

 

     构造函数:对象创建时候,会调用一次

     一般函数:对象创建以后,可以被调用多次

 

 

构造函数内存图解


注意:函数运行结束自动出栈,构造函数赋值成功了,就自动出栈,然后speak()进栈,方法结束后出栈。

 

构造函数细节

 1

 Person(String n){

      Name = n;

}

和public voidsetName(String name){ name= name}去别

构造函数就只是在对象创建的时候调用一次,但是普通的方法可以在以后随便调用,他们度可以给对象的name赋值;

2 构造方法可以调用一般函数

 

 

 

 

This关键字

    This:代表对象,代表哪个对象呢?当前对象

         This就是所在函数所属对象的引用。

        简单的说:就是哪个对象调用了this所在的函数,this就代表哪个对象。

class Constructor

{ String name;

 int age;

  public Constructor(String name){

   name = name;

   System.out.println(name);

 }

}

public class ConstructorDemo1{    

public static void main(String[] args){

         Constructor c = new Constructor("xiaoming");               //输出:xiaoming

         System.out.println(c.name);                             //输出:null

}

}                        

注意:如果name = name;变成this. name = name;c.name就是xiaoming

 

 

注:p.speak();speak进栈,同时自己也有p对象的地址,system.out.println(name+”:”+age);这个时候其实是:this.name+”:”+this.age;因为在栈中没有同名的参数,所以就去堆里面找,如果栈中有同名的,不用this就会输出栈中的值


注:方法结束后面就马上出栈。

 

方法中如果不用this.属性值,当两个地方度一样的时候会遵循就近原则




注:可以用来this来调用构造函数,但是只能写在第一行,且不能再空的构造方法里面调用一个参数的构造方法,然后再一个参数的构造方法中调用空的构造方法,会造成栈内存溢出



 

注意:当前对象调用conpare方法,传入参数Constructor constructor,就有两个对象了,this就是当前对象。


Static关键字

  特点:

1        static是一个修饰符,用于成员。

2        static修饰的成员被所有对象所共享。

3        static优先于对象存在,因为成员是随着类的加载而存在。

4        static的成员多了一种调用方法,可以被类名直接调用

5        static修饰的共享数据,对象存储的是特有数据。



成员变量和静态变量的区别

 1 两个变量的生命周期不同

     成员变量随着对象的创建而存在,随着对象被回收而消失

     静态变量随着类加载而产生,随着类的消失而消失

 

2 调用方法不用

  成员变量只能被成员调用

  静态变量可以被成员调用,也可以被类调用,()但是不建议用成员调用,因为这样不容易区分是不是静态变量)

 

3 别名不一样

  成员变量也成实例变量

  静态变量称为类变量

 

4  数据存储的位置不一样

  成员变量存储在堆内存的对象中,所以也叫对象的特有数据

  静态变量数据存储在方法区中(共享数据区),所以也叫对象的共享数据

 

 

 

静态在使用中需要注意的细节

1 静态方法中不能使用非静态变量,因为静态方法在类产生就可以使用,但是非静态成员要在实例了类才会在对中生产;

2 静态方法中不可以使用this和super

3主函数是静态的函数。

 

 

 

主函数特殊之处:

1 格式是固定的(publicstatic void main(String[] args))除了args其他都是固定的

2 被jvm所识别和调用

 

Public:因为权限必须最大

Static:不需要对象,,直接额用主函数所属类名调用即可。

Void:主函数没有具体返回值

Main:函数名,不是关键字,只是被jvm识别的固定的名字。

String[] args:这是函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。

 

 

Java StaticDemo2 ,此时就已经把代码加载到了内存中,第以行需要类Person,则Person就自己加载到方法区。

方法区中也有一个静态的区和动态的区,静态区存static修饰的变量或者方法,非静态区存放非静态的变量或者方法。


  栈中方法出栈顺序:1234,最后堆中没有引用,所以就被垃圾回收器回收了

 

 

静态什么时候用?

1 静态变量

 

2 静态函数

   函数是否定用静态修饰,就参考一点,是否要调用非静态的成员,如果有非静态的成员,不能写成static修饰,简单来说,从源代码看,该功能是否需要访问非静态变量,如果需要,该功能就是非静态的。但是不需要,就可以吧该功能定义成静态的,当然也可以定义成非静态的,

   但是非静态需要被调对象调用,而仅创建对象调用非静态,没有访问特有数据的方法,该对象的创建是没有意义的。

 

 

 

 

静态代码块:static{ 代码}

随着类的加载而进行初始化,一般做这个操作的都是静态方法和静态变量就进行唯一一次初始化(.属性名字或者类.方法名字()),如果有非静态的,一般属性和方法都用对象初始化,通过对象的不同初始化出不同的内容。

 

 

 

 

面试:

                             {//构造代码块,可以给所有对象进行初始化

                                     System.out.println("person run");

                             }

                            

                             Person(){//是给对应的对象进行针对性的初始化

                                     name = "baby";

                                     System.out.println("wawawawa");

                             }

构造代码块:给所有对象进行初始化,只要调用构造方法就会执行该代码块里面的代码,

静态代码块:调用类.属性或者类.方法就会给执行静态代码块,给静态代码块里面的书信赋值,给对象进行初始化动作。

 

 

原创粉丝点击