前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3 :面向对象初级

3 :面向对象初级

作者头像
六月的雨
发布2018-05-14 10:22:01
7290
发布2018-05-14 10:22:01
举报
文章被收录于专栏:Android开发指南

类和面向对象

特点:

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也可以初始化,但是静态代码块可以在里边运算变值

代码语言:javascript
复制
class StaticCode {  static int num ; static  {   num = 10;//	 num *=3;  System.out.println("hahahah"); } StaticCode(){} static void show()  {   System.out.println(num); }

构造代码块

代码语言:javascript
复制
class Person {  private String name;   {//构造代码块。可以给所有对象进行初始化的。 System.out.println("constructor code "); //	 cry(); } static  {   System.out.println("static code"); } Person()//是给对应的对象进行针对性的初始化。  {   name = "baby";//	 cry(); 用构造代码块替代,提高代码服用性 } Person(String name) {   this.name  = name;//	 cry(); } public void cry() {   System.out.println("哇哇");  }

局部代码块

代码语言:javascript
复制
public void speak() {  System.out.println("name:"+name);  {} //限定局部变量的生命周期 }

如果都有,先执行静态代码块,如果有对象构造代码块先执行,然后局部代码块


继承

继承的好处:

 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,对外提供一个方法让其他程序可以获取该对象。

饿汉式

代码语言:javascript
复制
class Single//类一加载,对象就已经存在了{ private static Single s = new Single(); private Single(){} public static Single getInstance() {  return s; }}

懒汉式

代码语言:javascript
复制
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象   //延迟加载形式{ private static Single2 s = null; private Single2(){} public static Single2 getInstance() {  if(s==null)   s = new Single2();  return s; }}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档