JavaSE基础之面向对象

一、面向对象简述
       面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。

       但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。

在面向对象定义之中,也规定了一些基本的特征:

  (1)封装:保护内部的操作不被破坏;

  (2)继承:在原本的基础之上继续进行扩充;

  (3)多态:在一个指定的范围之内进行概念的转换。

对于面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。(Object Oriented 面向对象)

二. 类与对象

1.类

   1)是同类型东西的概念,是对现实生活中事物的描述,映射到Java中描述就是class定义的类。类是对象的模板、图纸,是对象的数据结构定义。简单说就是“名词”。
   2)其实定义类,就是在描述事物,就是在定义属性(变量)和方法(函数)。
   3)类中可以声明:属性,方法,构造器;属性(变量)分为:实例变量,局部变量;

        实例变量:用于声明对象的结构的,在创建对象 时候分配内存,每个对象有一份!实例变量(对象属性)在堆中分配,并作用于整个类中,实例变量有默认值,不初始化也能参与运算;

        局部变量: 在栈中分配,作用于方法或语句中,必须初始化,有值才能运算。
   4)类与类之间的关系:
     ①关联:一个类作为另一个类的成员变量:需要另一个类来共同完成。class A { pulic B b }    class B {}    

     ②继承:class B extends A {}    class A {}       

     ③依赖:个别方法和另一个类相关。class A {    public void f(B b) {}//参数里有B     public B g() {}//返回值里有B  }  class B {}

 

 

 

 

 

 

 

 

5)null与空指针异常:引用类型变量用于存放对象的地址,可以给引用类型赋值为null(如: Person per = null;//声明对象 ),表示不指向任何对象。当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或调用方法,会产生NullPointerException空指针异常。

 

注意事项:除了8中基本类型,其他都是引用类型变量。

 

2.对象

       类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型

        对象是一类事物实实在在存在的个体!利用类做为模板创建的个体实例,本质是数据。

匿名对象:使用方式一:当对象的方法只调用一次时,可用匿名对象来完成,这样比较简化。如果对一个对象进行多个成员调用,则必须给这个对象起个名字。

               使用方式二:可以将匿名对象作为实际参数进行传递。

           

   class A {    
         public void f(B b) {}//参数里有B     
          } 

   class B {
        
       
        }

     public void Test() { 
             A a = new A();   
             a.f(new B(初始化参数)); 
      }

 

声明对象方式:  

     (1)格式一:声明并实例化对象

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

    (2)格式二:先声明对象,然后实例化对象:

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


      引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。
     当一个实例化对象产生之后,可以按照如下的方式进行类的操作:

                                   对象.属性:表示调用类之中的属性;

                                   对象.方法():表示调用类之中的方法。

我们从内存的角度分析。首先,给出两种内存空间的概念:
(1)堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
(2)栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。
 

3.引用传递

 

引用传递的精髓:同一块堆内存空间,可以同时被多个栈内存所指向,不同的栈可以修改同一块堆内存的内容。

 看下面示例:

class Person {
         String name ;
         int age ;
         public void tell() {
                   System.out.println("姓名:" + name + ",年龄:" + age) ;
         }
}
public class TestDemo {
         public static void main(String args[]) {
                   Person per1 = new Person() ;         // 声明并实例化对象
                   per1.name = "张三" ;
                   per1.age = 20 ;
                   Person per2 = per1 ;  // 引用传递 想创建的对象per1 也指向了 per2的堆内存地址
                   per2.name = "李四" ;  // per2 与 per1 指向的地址内容发生改变
                   per1.tell() ;
         }
}

 

class Person {
         String name ;
         int age ;
         public void tell() {
                   System.out.println("姓名:" + name + ",年龄:" + age) ;
         }
}
public class TestDemo {
         public static void main(String args[]) {
                   Person per1 = new Person() ;         // 声明并实例化对象
                   Person per2 = new Person() ;
                   per1.name = "张三" ;
                   per1.age = 20 ;
                   per2.name = "李四" ;
                   per2.age = 30 ;
                   per2 = per1 ;// 引用传递  per2也指向了 per1的内存地址
                   per2.name = "王五" ; //per2 与 per1 指向的地址内容发生改变
                   per1.tell() ;
         }
}

 

 4.垃圾

 

垃圾:指的是在程序开发之中没有任何对象所指向的一块堆内存空间,这块空间就成为垃圾,

 

所有的垃圾将等待GC(垃圾收集器)不定期的进行回收与空间的释放。

 

垃圾回收;收回的是内存空间的地址,不是真的’垃圾’,该地址再次被占用,原数据就会被覆盖

 

原文地址:https://www.cnblogs.com/luke-liuqi/p/9307008.html