1. 面向对象的概念

面向对象是相对面向过程而言,面向对象和面向过程都是一种思想

面向过程
• 强调的是功能行为
面向对象
• 将功能封装进对象,强调具备了功能的对象。

面向对象是基于面向过程的。

面向对象的特点:

  是一种符合人们思考习惯的思想, 可以将复杂的事情简单化, 将程序员从执行者转换成了指挥者.

完成需求时:
  • 先要去找具有所需的功能的对象来用。
  • 如果该对象不存在,那么创建一个具有所需功能的对象。
  • 这样简化开发并提高复用。

面向对象的开发过程: 其实就是不断的创建对象,使用对象,指挥对象做事情。

面向对象的设计过程: 其实就是在管理和维护对象之间的关系。

面向对象的特征:
  • 封装(encapsulation)
  • 继承(inheritance)
  • 多态(polymorphism)


2. 对象的创建与引用

Java中用类class来描述事物.是具体事物的抽象,概念上的定义。

  • 属性:对应类中的成员变量。
  • 行为:对应类中的成员函数。

对象即是该类事物实实在在存在的个体 。

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

成员变量定义在类中,在整个类中都可以被访问。
  • 成员变量随着对象的建立而建立,存在于对象所在的堆内存中。
  • 成员变量有默认初始化值。
局部变量:
  • 局部变量只定义在局部范围内,如:函数内,语句内等。
  • 局部变量存在于栈内存中。
  • 作用的范围结束,变量空间会自动释放。
  • 局部变量没有默认初始化值。

类定义包括类声明和类体两部分,类定义的语法格式如下:

[修饰符] class 类名 [extends 父类名] [implements 类实现的接口列表] {类体}

创建对象及访问对象成员

  1.声明对象 ,格式如下:

    类名  对象名表; 例如:Point   p1, p2;

  2.建立对象。实际上就是用Java提供的new关键字为对象分配存储空间。格式如下:

引用变量名= new 构造方法();

也可以在声明对象的同时建立对象 ,格式如下:类名 引用变量名 = new 构造方法() ;

  3.通过引用变量访问对象成员

引用变量名.属性

引用变量名.方法名(实参表)

匿名对象: 是对象的简化形式
匿名对象两种使用情况
  • 当对对象方法仅进行 一次调用时,这样达到了简化的目的.
  • 匿名对象可以作为实际参数进行传递

对象的初始化和构造方法

在创建对象时,要给对象的属性成员分配内存空间,同时进行初始化。

[1]如果定义属性成员时没有指定初值,则系统自动指定初值.在定义属性成员时也可以指定初值.public class Point {private int x=10;    ……

[2]指定初值的另一种办法是通过初始化块来设置对象的初值(也叫做构造代码块,它是给所有对象进行统一初始化)。 //注意首先是按照属性定义的初值,然后是初始化块,

[3]最后是构造方法:构造方法是给对相关设置初值的规范方法,构造方法是根据方法参数给对象属性赋不同的值.

构造方法的名称必须与类名同名;

构造方法没有返回类型,所以不可以写return语句;

  构造方法的作用: 给对象进行初始化

通常一个类可提供多个构造方法,这些方法的参数不同。在创建对象时,系统自动调用参数匹配的构造方法为对象初始化

如果一个类未指定构造方法,则系统自动提供的无参构造方法,但如果自定义了构造方法,则系统不再提供无参构造方法。无参构造方法形式如下: public Person() { } , 所以自己最好还要默默的加入无参构造方法

  什么时候定义构造方法: 当分析事物时, 该事物具备一定特性或行为,南无可以将这些内容定义在构造方法中.


3. 变量的作用域总结

     变量的作用域也称变量的有效范围,它是程序的一个区域,变量在其作用域内可以通过它的名字来引用。作用域也决定系统什么时候为变量创建和清除内存。根据变量在程序声明的位置,可以将变量分为4类情形。

[1]成员变量

成员变量可添加修饰符,包括访问权限修饰符public、private、protected和非访问权限修饰符static、final、native等。

如果没有给对象属性赋初值,则对象属性的初始值由相应数据类型的默认值决定,如数值型数据的默认值为0,boolean的默认值为false,字符串的默认值为null。成员变量的作用域是在类的范围。

[2]局部变量(自动变量) :  方法体中的局部变量

(1)在方法体内可以定义本方法所使用的变量,这种变量是局部变量,它的生存期与作用域是在本方法内。

(2)方法体内定义变量时,变量前不能加修饰符。

(3)局部变量在使用前必须明确赋值,因为它没有默认值,否则编译时会出错。

//在语句块中定义的变量它只在语句块中有效;

[3]方法参数:作用域是整个方法.

[4]异常处理参数:catch跟随的异常处理块.


4. 面向对象的第一个特性:封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离。 便于使用。提高重用性。提高安全性。
封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。


4. 类变量和静态(static)方法

用static修饰的属性是属于类的静态属性,相应的成员变量为类变量或静态变量.

1.类变量的访问形式

在本类中直接访问:count

通过类名访问:User.count

通过类的一个对象访问,如:x1.count

//这样用对象访问不是容易引起误会吗,淘汰吧.

2.给类变量赋初值

默认赋值即可,也可以用静态初始化代码块 static{count=100;}

//静态初始化代码的执行是在main方法执行前完成。

   3.被static修饰的类成员特点:

        是共享数据, 随着类的加载而加载, 优先于对象存在, 被所有对象所共享, 可以直接被类名调用.

静态方法 (当功能内部没访问对象特有数据时使用)

用 static修饰的方法称为静态方法,也叫类方法. 在static方法中只能处理类变量,也可访问其它static方法,但绝不能直接访问任何归属对象空间的变量或方法.

    静态方法中不可以写this,super关键字

    主函数是静态方法.

成员变量和静态变量的区别.
  1,两个变量的生命周期不同。
       成员变量随着对象的创建而存在,随着对象的被回收而释放。
       静态变量随着类的加载而存在,随着类的消失而消失。
  2,调用方式不同。
       成员变量只能被对象调用。
       静态变量可以被对象调用,还可以被类名调用。
  3,别名不同。
       成员变量也称为实例变量。
       静态变量称为类变量。
  4,数据存储位置不同。
       成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
       静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据. 
 
Tip: 创建某个工具类, 只提供相应的静态方法, 为了让某个类不能创建对象, 可以私有化构造函数.
关于构造函数的重要说明:
  一个类默认有一个空参数的构造函数,这个构造函数的权限与所属类一致. 如果类被public修饰,则默认的构造函数也被public修饰.总之默认构造函数的权限是随着类而变化.

5. 理解this和super

出现在类的实例方法或构造方法中,this代表所在函数所属对象的引用 .用this作前缀可访问当前对象的实例变量或成员方法.

1. this.实例变量;

2. this.成员方法(参数);

3. this(参数),用来调用同类的另一构造方法.注意this语句只能定义在构造函数的第一行,因为初始化要先执行.

super和this差不多,都是一个引用指向自身和上一级父类罢了


 6. 对象初始化过程总结

  1.new 用到了class文件,所以先回找到class文件并加载到内存

  2.执行类的static {}代码块

  3.在堆内存中开辟空间,分配内存地址

  4.在堆内存中建立对象的特有属性,病默认初始化

  5.对属性显示初始化;

  6.构造代码快初始化{};

  7.构造函数初始化;

  8.将内存地址赋给栈内存变量.


 7. 使用包组织类

Java API简介: Java中按包来组织类.包的组织采用分层结构,与文件系统中的目录的组织对应一致.通常将逻辑相关的类放在同一个包中.包将类的命名空间进行有效划分,同一包中不能有两个同名的类. Java系统提供的类库也成为Java API,他是系统提供的已实现的标准类的集合.

建立包

创建包就是在指定目录路径下创建一个 子文件夹 ,这个包中所有类的字节码文件将存放在该文件夹下.

方法1:创建一个test子目录,将源程序文件存放到该目录,在该目录下利用javac编译源代码,或者在别处编译完程序后将字节码文件拷贝到该目录即可。

方法2:采用带路径指示的编译命令: 格式:javac –d  destpath Point.java

编译器将自动在destpath指定的目录下建一个test子目录,并将产生的字节码文件保存到该子目录下

典型用法是源程序放在当前目录下,用如下命令编译 javac –d . Point.java  编译后将在当前目录自动创建test子目录

包的引用

(1) 在引用类时使用包名作前缀例 :new java.util.Date()

(2) 用import语句加载需要使用的类。例:import java.util.Date; 然后在程序中可以直接通过类名创建对象, 如:new Date();

(3) 用import语句加载整个包, 用“*”号代替类名位置。 它将加载包中的所有的类。例如:import java.util.*;

小知识:使用javadoc制作帮助文档

  不就是javadoc -d destpath -version -author Tools.java

总结:包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰.


8. Java拓展知识: 单例设计模式

  设计模式:解决某一类问题最行之有效的方法.

  Java中的23种设计模式

  单例设计模式: 解决一个类只存在一个对象.

  想要保证对象唯一:

    1. 禁止其他程序建立该对象(构造函数私有化)

    2. 在本类中定义一个对象(本类建立静态对象)

    3. 对外提供访问该对象的方式(提供getInstance()方法返回该对象)

 //懒汉式推荐使用
class Single{
private static Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
} //饿汉式不推荐使用, 对象的掩饰加载, 但有2句话会引起线程安全问题
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s == null)
s = new Single();
return s;
}
} //加锁处理
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s == null)
synchronized(Single.class){
if(s == null)
s = new Single();
}
return s;
}
}

03_Java面向对象特征: 封装性的更多相关文章

  1. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  2. java面向对象之封装性

    面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...

  3. php面向对象的封装性

    面向对象编程 1:封装性 访问修饰符,作用为封装,防止外部访问. public 公有的 private 私有的 protected 受保护的 一开始具体也没搞明白是怎么回事,搞个小的Demo就出来了 ...

  4. JAVASE(七)面向对象:封装性(特性之一)、构造器、属性、关键字

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.封装性 1.为什么要使用封装性? 创建对象以后,可以通过对象.属性名的方法进行赋值.只能限制数据的类 ...

  5. 面向对象特征:封装、多态 以及 @propetry装饰器

    (继承补充)组合 obj=fun()#对象 obj.attr=foo()#对象的属性等于另一个对象 什么是组合:     A类的对象具备某一个属性,该属性的值是B类的对象   基于这种方式就把A类与B ...

  6. [ Java学习基础 ] Java的封装性与访问控制

    Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表: 1.私有级别 私有级别的关键字是private,私有级别的成员变量和方 ...

  7. JavaScript大杂烩3 - 理解JavaScript对象的封装性

    JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...

  8. Java连载37-面向对象的封装性

    一.IDE上继续新建工程 1.在src目录下新建软件包:package机制后面再讲,目前先用着 2.给package命名一个名称:com.bjpowernode.java_learning 3.软件包 ...

  9. vb.net和C#两兄弟谁的封装性更好?

    引言: 虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的.前者是从后者基础上发展而来的.后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是 ...

随机推荐

  1. JavaScript实现字符串的contains函数

    JavaScript实现字符串的contains函数 / *  * string:原始字符串  * substr:子字符串  * isIgnoreCase:忽略大小写  * / function co ...

  2. IOS- 堆和栈 详解

    Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就 ...

  3. Xcode找不到模拟器

    今天新建的工程,突然发现模拟器找不到了,之前遇到过忘记怎么解决了,于是再次记录下解决方法. 首先说下问什么找不到模拟器了,原因就是之前运行的版本和现在xcode的版本不同(的确,我从 Xcode7.3 ...

  4. MAC下GitHub命令操作

    由于GitHub实在太有用了~~ ,各种源代码,开源工程,经常需要下载下来使用和学习,或者自己的代码需要上传之类的,尽管有"GitHub for Mac"工具,但是作为一名程序猿! ...

  5. Innodb之拷贝InnoDB表从一服务器到另一台服务器

    将Innodb类型的表从一台服务器拷贝到另一台服务器,或从一个库拷贝到另一个库. 前提是:innodb_file_per_table =ON. 1 先在目标服务器(库)上创建一个相同的表结构. 如: ...

  6. markdown思维导图笔记

  7. Html和CSS的关系

    1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2. CSS样式是表现.就像网页的外衣.比如,标题字体.颜色变化,或为标题加入背景图片. ...

  8. PHP常用函数大全。

    php usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_ ...

  9. Python lambda函数使用

  10. 学习ASP.NET缓存机制

    缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...