java 自学日志【五】---面向对象之封装
2013-04-11 03:19
281 查看
------android培训,java培训,期待与您交流------
面向对象----概述
面向对象思想:面向对象是相对于面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能,
而面向对象强调的是将功能封装进对象,强调具备功能的对象.
面向对象的思想特点:是符合人们思考习惯的一种思想,将复杂的问题简单化,将程序员从执行者变成指挥者。
例如要达到某种结果,我只需要找到能帮助我达到该结果的功能的对象,如我要洗衣服,要是我自己手洗,这是面向过程思想,我要是找台洗衣机,至于洗衣机里面是怎么操作的我不知道,我达到了洗衣服的结果,这就是面向对象,洗衣机就把洗衣服的功能封装起来了。
从功能封装的角度讲,面向对象和面向过程一样,也是函数,但是面向对象可以将多个联系紧密的函数封装在一起,形成类,当你需要某个功能,只需要调用这个类建立一个对象,拿对象来调用这个功能就行了。
面向对象的开发,就是找对象使用,如果没有对象,就建立一个对象,而程序员要做的就是,找对象,使用对象,建立对象,维护对象之间的关系。
类与对象之间的关系:类是对现实世界事物的抽象描述,类的成员变量对应事物的属性,成员方法对应事物的行为,类的一个实例,即 对象,对应现实事物的一个个 实体。
成员变量与局部变量的区别:
①作用域:成员变量----->整个类中有效;
局部变量----->局部范围有效,方法中或语句内,最近的{}中有效;
②内存中存储位置: 成员变量--->堆内存中,随着对象的建立而存在,随着对象的 消失而消失;
局部变量--->栈内存中,方法被调用或语句执行用时存在,当方法调用完,或语句执行结束后,自动释放;
③初始化值:成员变量-----> 有默认初始值;
局部变量-----> 没有默认初始值,使用前必须赋值;
匿名对象:顾名思义,就是没有名字的对象,是对象的一种简写形式。
匿名对象特点:1.可以调用属性,但没有意义;2.调用方法有意义,但只能调用一次,若对一个对象进行多次成员调用必须给该对象建立引用;
3.可以作为参数传递给函数。
匿名对象举例:
面向对象三大特征:封装,继承,多态。
封装(Encapsulation)
【一】
概念:封装是指隐藏对象的属性和实现细节,紧对外提供公共访问的方式。
好处:将变化隔离,方便使用,提高重用性,提高安全性。
封装原则:①将不需要对外提供的内容都隐藏起来;②把属性都隐藏,提供公共方法对其访问。
提供对外访问方法,就可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码健壮性。
【二】private 关键字
private:私有,权限修饰符,用于修饰成员变量和成员方法,被private修饰的成员只在本类中有效,是封装的一种体现。
private举例:
【三】构造函数
特点:函数与类名相同,没有返回值,没有返回值类型,不可以有return语句。对象一建立,就会调用与之对应的构造函数,并给对象初始化,一个对象的构造函数只运行一次,而一般函数可以通过对象的调用运行多次。
作用:给对象进行初始化。
ps: 当一个类中没有定义构造函数时,系统会默认给该类添加一个空参构造函数,权限和类一致,便于类的初始化,当在类中自定义了构造函数,默认的就不存在了。构造函数可以重载。
什么时候定义构造函数?
当分析事物时,事物具备一些特性或行为,就将这些内容定义在构造函数中。
构造代码块:{},给所有对象进行统一初始化,对象一建立就执行,而且优先于构造函数执行,构造函数时给对应的对象初始化。
如不同对象有共性的初始化内容,可以将这部分内容定义在构造代码块中。
*构造函数可以私有化,一旦私有化,就不能够创建对象!
【四】this关键字
this:代表调用this所在函数的那个对象,谁调用this所在的方法,this就代表谁,类内部函数之间的调用都是通过对象完成的,只是默认省略了this,通过this就可以将局部变量和成员变量区分开。
什么时候用this?当定义类的功能时,如果功能内部需要调用这个功能的对象,那么就用this代表这个对象。
this语句:this(),用于构造函数间的调用,并且只能放在构造函数的第一行,因为初始化动作要先执行,主要不要用this语句构成构造函数间的死循环。
【五】static 静态
static 关键字,修饰符,用于修饰成员变量和成员方法,当成员被修饰成静态后,就多了一个调用方法,除了可以被对象调用外,还可以直接被类名调用,格式:类名.静态成员。
特有数据随着对象存储,放在堆内存中;共享数据用static修饰,放在方法区中;
static特点:①随着类的加载而加载,随着类的消失而消失;
②优先于对象存在,静态变量先存在,对象后存在;
③被所有对象共享;
④可以直接被类名调用;
实例变量和类变量的区别:
①存储位置:实例变量随着对象加载而存在于堆内存中;
类变量随着类的加载而存在于方法区中;
②生命周期:实例变量随着对象的消失而消失;
类变量随着类的消失而消失,生命周期长;
方法区:也叫共享区,数据区,一个类加载后,都会开辟该类的方法区,存储静态部分和非静态部分,类的方法区开辟先于对象堆内存空间的开辟。
static静态的使用注意事项:
①静态方法只能访问静态成员,包括静态变量和静态方法,但非静态方法既可以访问静态成员,也可以访问非静态成员;
②静态方法中不可以定义this,super关键字;因为静态优先于对象而存在。
③主函数是静态,是一个特殊的函数,作为程序的入口,可以被jvm调用。
public static void main(String[] args)
public:公共的意思,是最大权限修饰符。
static:由于jvm调用main方法的时候,没有创建对象。只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名
在运行的时候,通过java命令给args数组赋值。格式:java MainTest hello world itcast
主函数有一般静态成员的特点,可以被其他静态成员所调用,也可以被对象调用。
静态的利弊:利:对对象的共享数据进行单独存储,节省空间,可以直接用类名调用,方便;
弊:生命周期长,访问有局限性,只能访问静态;
从静态函数和静态变量两方面入手,当对象中出现共享数据时,把该数据用static修饰,而对象中的特有数据要定义成非静态,存放于堆内存中;当功能内部没有访问到非静态数据或对象的特有数据时,那么可以把该功能定义成静态的。
静态代码块:static {静态代码块执行语句};
特点:随着类的加载而执行,只执行一次,用于给类初始化,优先于主函数,只有用到了类中的内容才加载类,才执行静态代码块。
*执行顺序: 静态代码块--- 构造代码块---构造函数
制作程序文档注释:[b]/** */.也叫API文档,API(Application
Program Interface 应用程序编程接口);[/b]
使用JDK\bin目录下的javadoc工具。格式:javadoc -d 目录 -author -version ArrayTool.java。
注意:能被提取的注释必须是public或protected的。
对象的初始化过程:对于视频中 Person p = new Person ("andy",20);
1 new用到了Person.class,所以会先找到该类的字节码文件,并将之加载到内存中;
2 执行静态代码块,如果有的话,对类进行初始化;
3在堆内存中开辟内存空间,分配地址值;
4 在堆内存中建立对象特有的属性,并对属性进行默认初始化;
5 对属性进行显示初始化;
6 执行构造代码块,进行对象初始化;
7 执行与对象对应的构造函数,进行初始化;
8 将地址值赋给栈内存中的引用变量;
对象调用成员过程:
静态成员之间的调用省略了“类名.”,非静态成员之间的调用则省略了this。
【六】单例设计模式
设计模式:最早存在于建筑领域,后引入计算机设计。GOF总结了23中设计模式。设计模式偏重思想,要结合实际,否则就会显得很空乏。模式的综合就形成了框架。设计模式是解决某一类问题最行之有效的方法。
单例设计模式:解决一个类在内存中,只有一个对象这样的问题。
如何形成单例?
1 构造函数全部私有,禁止其他程序建立该类对象;
2 在类中创建一个本类对象,并静态私有;
3 提供对外访问该类对象的静态方法;
对于事物该怎么描述还怎么描述,需要将事物的对象保证在内存中唯一时,就加上以上3步骤。
单例设计模式有两种: 懒汉式和 饿汉式
1 饿汉式 :类一加载进内存,就创建好了对象;
面向对象----概述
面向对象思想:面向对象是相对于面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能,
而面向对象强调的是将功能封装进对象,强调具备功能的对象.
面向对象的思想特点:是符合人们思考习惯的一种思想,将复杂的问题简单化,将程序员从执行者变成指挥者。
例如要达到某种结果,我只需要找到能帮助我达到该结果的功能的对象,如我要洗衣服,要是我自己手洗,这是面向过程思想,我要是找台洗衣机,至于洗衣机里面是怎么操作的我不知道,我达到了洗衣服的结果,这就是面向对象,洗衣机就把洗衣服的功能封装起来了。
从功能封装的角度讲,面向对象和面向过程一样,也是函数,但是面向对象可以将多个联系紧密的函数封装在一起,形成类,当你需要某个功能,只需要调用这个类建立一个对象,拿对象来调用这个功能就行了。
面向对象的开发,就是找对象使用,如果没有对象,就建立一个对象,而程序员要做的就是,找对象,使用对象,建立对象,维护对象之间的关系。
类与对象之间的关系:类是对现实世界事物的抽象描述,类的成员变量对应事物的属性,成员方法对应事物的行为,类的一个实例,即 对象,对应现实事物的一个个 实体。
成员变量与局部变量的区别:
①作用域:成员变量----->整个类中有效;
局部变量----->局部范围有效,方法中或语句内,最近的{}中有效;
②内存中存储位置: 成员变量--->堆内存中,随着对象的建立而存在,随着对象的 消失而消失;
局部变量--->栈内存中,方法被调用或语句执行用时存在,当方法调用完,或语句执行结束后,自动释放;
③初始化值:成员变量-----> 有默认初始值;
局部变量-----> 没有默认初始值,使用前必须赋值;
匿名对象:顾名思义,就是没有名字的对象,是对象的一种简写形式。
匿名对象特点:1.可以调用属性,但没有意义;2.调用方法有意义,但只能调用一次,若对一个对象进行多次成员调用必须给该对象建立引用;
3.可以作为参数传递给函数。
匿名对象举例:
class Person { int age =20;//成员变量 String name ="andy"; public void run()//成员方法 { System.out.println(name+"---"+age); } } class PersonDemo { public static void main(String[] args) { /* Person p = new Person(); //建立对象 p.age =30; p.name ="tony" p.run(); */ //new Person().age= 30;// 建立匿名对象,调用person属性,无意义。 //new person().run();// 建立匿名对象,调用person的run方法。只能调用一次。 show(new Person());//匿名对象作为参数传递给函数。 } public static void show(Person p) { p.age =40; p.name ="jack"; p.run(); } }
面向对象三大特征:封装,继承,多态。
封装(Encapsulation)
【一】
概念:封装是指隐藏对象的属性和实现细节,紧对外提供公共访问的方式。
好处:将变化隔离,方便使用,提高重用性,提高安全性。
封装原则:①将不需要对外提供的内容都隐藏起来;②把属性都隐藏,提供公共方法对其访问。
提供对外访问方法,就可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码健壮性。
【二】private 关键字
private:私有,权限修饰符,用于修饰成员变量和成员方法,被private修饰的成员只在本类中有效,是封装的一种体现。
private举例:
class Person { private int age;//私有 age, public void run() { System.out.println("age="+age); } public void setAge(int a)// 对外提供公共访问方式,并判断传入年龄合不合法。 { if (a>0&& a<130) { age = a; run(); } else System.out.println("error"); } } class PersonDemo { public static void main(String[] args) { Person p = new Person(); p.setAge(-55); } }
【三】构造函数
特点:函数与类名相同,没有返回值,没有返回值类型,不可以有return语句。对象一建立,就会调用与之对应的构造函数,并给对象初始化,一个对象的构造函数只运行一次,而一般函数可以通过对象的调用运行多次。
作用:给对象进行初始化。
ps: 当一个类中没有定义构造函数时,系统会默认给该类添加一个空参构造函数,权限和类一致,便于类的初始化,当在类中自定义了构造函数,默认的就不存在了。构造函数可以重载。
什么时候定义构造函数?
当分析事物时,事物具备一些特性或行为,就将这些内容定义在构造函数中。
构造代码块:{},给所有对象进行统一初始化,对象一建立就执行,而且优先于构造函数执行,构造函数时给对应的对象初始化。
如不同对象有共性的初始化内容,可以将这部分内容定义在构造代码块中。
*构造函数可以私有化,一旦私有化,就不能够创建对象!
【四】this关键字
this:代表调用this所在函数的那个对象,谁调用this所在的方法,this就代表谁,类内部函数之间的调用都是通过对象完成的,只是默认省略了this,通过this就可以将局部变量和成员变量区分开。
什么时候用this?当定义类的功能时,如果功能内部需要调用这个功能的对象,那么就用this代表这个对象。
this语句:this(),用于构造函数间的调用,并且只能放在构造函数的第一行,因为初始化动作要先执行,主要不要用this语句构成构造函数间的死循环。
class Person { private int age; private String name; { System.out.println("cry......"); }//构造代码块, //person(){} 系统默认的空参构造函数 Person()//自定义构造函数 { System.out.println("A: name "+name+",age "+age); } Person(String name)//构造函数的重载 { this.name = name;//this 关键字,代表pb这个对象,如果此处省略this,局部变量和成员变量重名。调用失败。 } Person(String name,int age) { this(name);//this 语句,只能用于构造函数之间调用。 this.age = age; } public void run() { System.out.println(" name "+name+",age "+age);//name和age前省略了this } } class PersonDemo2 { public static void main(String[] args) { Person pa = new Person(); Person pb = new Person("andy",20); pb.run(); } }
【五】static 静态
static 关键字,修饰符,用于修饰成员变量和成员方法,当成员被修饰成静态后,就多了一个调用方法,除了可以被对象调用外,还可以直接被类名调用,格式:类名.静态成员。
特有数据随着对象存储,放在堆内存中;共享数据用static修饰,放在方法区中;
static特点:①随着类的加载而加载,随着类的消失而消失;
②优先于对象存在,静态变量先存在,对象后存在;
③被所有对象共享;
④可以直接被类名调用;
实例变量和类变量的区别:
①存储位置:实例变量随着对象加载而存在于堆内存中;
类变量随着类的加载而存在于方法区中;
②生命周期:实例变量随着对象的消失而消失;
类变量随着类的消失而消失,生命周期长;
方法区:也叫共享区,数据区,一个类加载后,都会开辟该类的方法区,存储静态部分和非静态部分,类的方法区开辟先于对象堆内存空间的开辟。
static静态的使用注意事项:
①静态方法只能访问静态成员,包括静态变量和静态方法,但非静态方法既可以访问静态成员,也可以访问非静态成员;
②静态方法中不可以定义this,super关键字;因为静态优先于对象而存在。
③主函数是静态,是一个特殊的函数,作为程序的入口,可以被jvm调用。
public static void main(String[] args)
public:公共的意思,是最大权限修饰符。
static:由于jvm调用main方法的时候,没有创建对象。只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名
在运行的时候,通过java命令给args数组赋值。格式:java MainTest hello world itcast
主函数有一般静态成员的特点,可以被其他静态成员所调用,也可以被对象调用。
静态的利弊:利:对对象的共享数据进行单独存储,节省空间,可以直接用类名调用,方便;
弊:生命周期长,访问有局限性,只能访问静态;
class Per { String name;//成员变量,实例变量 static String country ="China";//静态成员变量,类变量 public void show()//此处方法不能定义成静态,因为name不是静态变量,而country是静态。 { System.out.println(name+"---"+country); } } class PersonDemo3 { public static void main(String[] args) { Per p1 = new Per(); p1.name = "andy"; p1.show(); System.out.println(Per.country);//类名直接调用静态成员 } }什么时候使用静态?
从静态函数和静态变量两方面入手,当对象中出现共享数据时,把该数据用static修饰,而对象中的特有数据要定义成非静态,存放于堆内存中;当功能内部没有访问到非静态数据或对象的特有数据时,那么可以把该功能定义成静态的。
静态代码块:static {静态代码块执行语句};
特点:随着类的加载而执行,只执行一次,用于给类初始化,优先于主函数,只有用到了类中的内容才加载类,才执行静态代码块。
*执行顺序: 静态代码块--- 构造代码块---构造函数
制作程序文档注释:[b]/** */.也叫API文档,API(Application
Program Interface 应用程序编程接口);[/b]
使用JDK\bin目录下的javadoc工具。格式:javadoc -d 目录 -author -version ArrayTool.java。
注意:能被提取的注释必须是public或protected的。
对象的初始化过程:对于视频中 Person p = new Person ("andy",20);
1 new用到了Person.class,所以会先找到该类的字节码文件,并将之加载到内存中;
2 执行静态代码块,如果有的话,对类进行初始化;
3在堆内存中开辟内存空间,分配地址值;
4 在堆内存中建立对象特有的属性,并对属性进行默认初始化;
5 对属性进行显示初始化;
6 执行构造代码块,进行对象初始化;
7 执行与对象对应的构造函数,进行初始化;
8 将地址值赋给栈内存中的引用变量;
对象调用成员过程:
静态成员之间的调用省略了“类名.”,非静态成员之间的调用则省略了this。
【六】单例设计模式
设计模式:最早存在于建筑领域,后引入计算机设计。GOF总结了23中设计模式。设计模式偏重思想,要结合实际,否则就会显得很空乏。模式的综合就形成了框架。设计模式是解决某一类问题最行之有效的方法。
单例设计模式:解决一个类在内存中,只有一个对象这样的问题。
如何形成单例?
1 构造函数全部私有,禁止其他程序建立该类对象;
2 在类中创建一个本类对象,并静态私有;
3 提供对外访问该类对象的静态方法;
对于事物该怎么描述还怎么描述,需要将事物的对象保证在内存中唯一时,就加上以上3步骤。
单例设计模式有两种: 懒汉式和 饿汉式
1 饿汉式 :类一加载进内存,就创建好了对象;
class Single { private Single(){}; private static Single s = new Single(); public static Single getInstance() { return s; } } class SingleDemo { public static void main(String[] args) { Single x = Single.getInstance(); } }2 懒汉式:类才加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。延迟加载。
class Single { private Single(){} private static Single s = null; public static Single getInstance() { if (s ==null) s = new Single(); return s; } }PS:开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题。
相关文章推荐
- 黑马程序员 Java自学总结六 面向对象三个特征之封装
- Java自学笔记(第五天)面向对象--char[]和String--封装--构造函数--this
- java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍
- Java程序员从笨鸟到菜鸟之(三)面向对象之封装,继承,多态(下)
- 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)
- Java 日志输出工具 & Bean封装工具
- Java程序员从笨鸟到菜鸟之(三)面向对象之封装,继承,多态(下)
- [疯狂Java]面向对象:封装(JavaBean)、包(package)、import(导入和静态导入)
- Java面向对象的三个特征与含义(封装 继承 多态)
- JAVA_面向对象_练习_封装_02_EncapsulationDaemon02.java
- Java记录 -9- 面向对象之封装
- 黑马程序员-java面向对象的概念及封装总结
- Java学习第6天:面向对象(4)封装和私有
- Java中面向对象的封装,继承,重载重写
- Java 面向对象 第一部分(封装)
- Java 自学日志【二】
- 自学Java Swing日志(一)
- Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)
- 黑马程序员——Java基础——面向对象-封装-static使用
- 深入理解Java面向对象三大特性 封装 继承 多态