码迷,mamicode.com
首页 > 其他好文 > 详细

3 :面向对象初级

时间:2015-10-26 16:52:44      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

类和面向对象
特点:
1,面向对象就是一种常见的思想。符合人们的思考习惯。
2,面向对象的出现,将复杂的问题简单化。
3,面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。
技术分享
技术分享


成员变量和局部变量
类其实就是在定义类中的成员。
成员:成员变量<-->属性,成员函数<-->行为。
成员变量和局部变量的区别: 
1, 
成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2, 
成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
3, 
成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4, 
成员变量都有默认初始化值。
局部变量没有默认初始化值。 

技术分享

基本:string、int、char之类的
引用:数组、对象、接口
基本数据和引用数据类型是如何传递的?
技术分享
类类型的变量参数传递,提高代码复用性
技术分享




封装和隐藏
private:私有,是一个权限修饰符。用于修饰成员(变量和函数)。
通过getxx和setxx方法访问,对xx进行了封装,不是直接对xx操作
 私有的内容只在本类中有效。
注意:私有仅仅是封装的一种体现而已。但封装不是私有。


this
当成员变量和局部变量重名,可以用关键字this来区分。
this : 代表对象。代表哪个对象呢?当前对象。 
this就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。

this也可以用于在构造函数中调用其他构造函数。
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。
技术分享
技术分享
技术分享

构造器
构造函数:构建创造对象时调用的函数。作用:可以给对象进行初始化。
创建对象都必须要通过构造函数初始化。

一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。
如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。 重载了

一般函数和构造函数什么区别呢?
构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。 
一般函数:对象创建后,需要函数功能时才调用。

构造函数:对象创建时,会调用只调用一次。
一般函数:对象创建后,可以被调用多次。


什么时候定义构造函数呢?
在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。 
构造函数可以有多个,用于对不同的对象进行针对性的初始化. 
多个构造函数在类中是以重载的形式来体现的。
技术分享

细节:
1,构造函数如果完成了set功能。set方法是否需要。 
2,一般函数不能直接调用构造函数。
3,构造函数如果前面加了void就变成了一般函数。
4,构造函数中是有return语句的。只不过是隐藏不写了
构造函数图解
技术分享
构造函数间调用

技术分享


static
String name;//成员变量,实例变量
 static String country = "CN";//静态变量。类变量 

static的特点:
1,static是一个修饰符,用于修饰成员。
2,static修饰的成员被所有的对象所共享。
3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。
4,static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。
5,static修饰的数据是共享数据,对象中的存储的是特有数据。

成员变量和静态变量的区别? 
1,两个变量的生命周期不同。
 成员变量随着对象的创建而存在,随着对象的被回收而释放。
 静态变量随着类的加载而存在,随着类的消失而消失。 生命周期长
2,调用方式不同。 
 成员变量只能被对象调用。
 静态变量可以被对象调用,还可以被类名调用。
3,别名不同。 
 成员变量也称为实例变量。
 静态变量称为类变量。
4,数据存储位置不同。 
 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
 静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.


静态使用的注意事项: 
1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2,静态方法中不可以使用this或者super关键字。
3,主函数是静态的。

主函数
主函数特殊之处:
1,格式是固定的。
2,被jvm所识别和调用。
public:因为权限必须是最大的。 
static:不需要对象的,直接用主函数所属类名调用即可。
技术分享
void:主函数没有具体的返回值。
main:函数名,不是关键字,只是一个jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。
技术分享
静态什么时候用?
1,静态变量。
 当分析对象中所具备的成员变量的值都是相同的 。
 这时这个成员就可以被静态修饰。
 只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
 如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
2,静态函数。 
 函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。
 简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
 如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,
 但是非静态需要被对象调用,而仅创建对象调用非静态的
 没有访问特有数据的方法,该对象的创建是没有意义。浪费空间,静态的话是存在静态区的


技术分享



代码块
静态代码块。
随着类的加载而执行。而且只执行一次。静态成员是是随着类的加载就存在于 静态区
作用: 
 用于给类进行初始化。 直接int num=3也可以初始化,但是静态代码块可以在里边运算变值
  1. class StaticCode { 
  2.  static int num ;
  3.  static  
  4. { 
  5.   num = 10;
  6. // num *=3;
  7.   System.out.println("hahahah");
  8.  }
  9.  StaticCode(){}
  10.  static void show()  { 
  11.   System.out.println(num);
  12.  }

构造代码块
  1. class Person { 
  2.  private String name;
  3.    {//构造代码块。可以给所有对象进行初始化的。 
  4. System.out.println("constructor code "); 
  5. // cry();
  6.  }
  7.  
  8. static  { 
  9.   System.out.println("static code");
  10.  }
  11.  
  12. Person()//是给对应的对象进行针对性的初始化。  { 
  13.   name = "baby";
  14. // cry(); 用构造代码块替代,提高代码服用性
  15.  }
  16.  Person(String name) { 
  17.   this.name  = name;
  18. // cry();
  19.  }
  20.  public void cry() { 
  21.   System.out.println("哇哇");
  22.   }
局部代码块
  1. public void speak()
  2.  {
  3.   System.out.println("name:"+name);
  4.   {} //限定局部变量的生命周期
  5.  }
如果都有,先执行静态代码块,如果有对象构造代码块先执行,然后局部代码块

技术分享

继承
继承的好处:
 1,提高了代码的复用性。
 2,让类与类之间产生了关系,给第三个特征多态提供了前提.

单继承:一个子类只能有一个直接父类。 
多继承:一个子类可以有多个直接父类(java中不允许,但进行了改良) 
不直接支持,因为多个父类中有相同成员,会产生调用不确定性。 
在java中是通过"多实现"的方式来体现。


java支持多层(多重)继承。
C继承B,B继承A。 
就会出现继承体系。
当要使用一个继承体系时, 
1,查看该体系中的顶层类,了解该体系的基本功能。
2,创建体系中的最子类对象,完成功能的使用。 

什么时候定义继承呢?
当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种。 xxx extends yyy 
所属关系: is a 关系。

在子父类中,成员的特点体现。 
1,成员变量。
2,成员函数。
3,构造函数。
子类不能继承父类中私有的成员变量和方法

 1,成员变量。 
当本类的成员和局部变量同名用this区分。
当子父类中的成员变量同名用super区分父类。
this和super的用法很相似。 
this:代表一个本类对象的引用。
super:代表一个父类空间。
技术分享
2,成员函数。
当子父类中出现成员函数一模一样的情况,会运行子类的函数。
这种现象,称为覆盖操作。这时函数在子父类中的特性。
技术分享
函数两个特性:
 1,重载。同一个类中。overload
 2,覆盖。子类中。覆盖也称为重写,覆写。override
  覆盖注意事项: 
1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。
2,静态只能覆盖静态,或被静态覆盖。
什么时候使用覆盖操作?
当对一个类进行子类的扩展时,子类需要保留父类的功能声明, 
但是要定义子类中该功能的特有内容时,就使用覆盖操作完成.
技术分享
3,构造函数
子父类中的构造函数的特点。
在子类构造对象时,发现,访问子类构造函数时,父类也运行了。 
为什么呢?
原因是:在子类的构造函数中第一行有一个默认的隐式语句。 super();
子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。
 
  • 为什么子类实例化的时候要访问父类中的构造函数呢? 
那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,
要先看父类是如何对自己的内容进行初始化的。
所以子类在构造对象时,必须访问父类中的构造函数。
为什么完成这个必须的动作,就在子类的构造函数中加入了super()语句。
如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用
父类中哪个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,
那么super就没有了,因为super和this都只能定义第一行。所以只能有一个。
但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。
注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。

技术分享
一个对象实例化过程:
zi p = new zi();
1,JVM会读取指定的路径下的zi.class文件,并加载进内存,
 并会先加载zi的父类(如果有直接的父类的情况下).
2,在堆内存中的开辟空间,分配地址。
3,并在对象空间中,对对象中的属性进行默认初始化。
4,调用对应的构造函数进行初始化。
5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。
6,父类初始化完毕后,在对子类的属性进行显示初始化。
7,在进行子类构造函数的特定初始化。
8,初始化完毕后,将地址值赋值给引用变量.
技术分享


设计模式:对问题行之有效的解决方式。其实它是一种思想。

单例设计模式。
 解决的问题:就是可以保证一个类在内存中的对象唯一性。

必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

如何保证对象唯一性呢?
1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。

技术分享




技术分享
饿汉式
  1. class Single//类一加载,对象就已经存在了
  2. {
  3.  private static Single s = new Single();
  4.  private Single(){}
  5.  public static Single getInstance()
  6.  {
  7.   return s;
  8.  }
  9. }

懒汉式
  1. class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
  2.    //延迟加载形式
  3. {
  4.  private static Single2 s = null;
  5.  private Single2(){}
  6.  public static Single2 getInstance()
  7.  {
  8.   if(s==null)
  9.    s = new Single2();
  10.   return s;
  11.  }
  12. }







3 :面向对象初级

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4911575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!