------- android培训、java培训、java学习型技术博客、期待与您交流! ----------
面向对象---封装
1、认识面向对象(了解★★☆☆☆)
1.1 面向对象:将功能封装进对象,强调具备了功能的对象。
特征:
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
1.2 用java语言对现实生活中的事物进行描述。通过类的形式来体现的。
对象:其实就是该类事物实实在在存在的个体。
类与对象的关系?
类:事物描述。
对象:该类事物的实例。使用new来创建。
1.3 成员变量和局部变量的区别:
a.成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
b.成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
c.成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
d.成员变量都有默认初始化值。
局部变量没有默认初始化值。不能被public、private、static修饰。
1.4 匿名对象
匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
如果对一个对象进行多个成员调用,必须给这个对象起个名字。
匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。
如:new Car().run();、show(new Car());
2、封装(了解★★☆☆☆)
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
将变化隔离。
便于使用。
提高重用性。
提高安全性。
封装原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。
private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
私有只在本类中有效。
将变量私有化以后,类以外即使建立了对象也不能直接访问。
3、构造函数(重要★★★★☆)
对象一建立就会调用与之对应的构造函数。
作用:可以用于给对象进行初始化。
小细节:当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。
类名(参数)
{
代码块//不用写return语句
}
多个构造函数以重载的形式存在。
构造函数是在对象一建立就运行。给对象初始化。
一般函数是对象调用才执行,是对象添加对象具备的功能。
一个类中默认会有一个空参数的构造函数,
这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰符。
如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
默认构造构造函数的权限是随着的类的变化而变化的。
3.1构造代码块
定义格式
{
代码;
}
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
与构造函数的区别:
构造代码块是给所有对象进行统一初始化。
而构造函数是给对应的对象初始化。
4、this关键字
特点:this代表其所在函数所属对象的引用。this代表本类对象的
this代表它所在函数所属对象的引用。
哪个对象在调用this所在的函数,this就代表哪个对象。
this的应用:在定义类中功能时,该函数内部要用到该函数的对象时,
这时用this来表示这个对象。但凡本类功能内部使用了本类对象,都用this表示。
this语句 :用于构造函数之间进行互相调用。
如:this();
this语句只能定义在构造函数的第一行。因为初始化要先执行。默认都在第一行。
如:
class Person
{
private String name;
private int age;
Person(int age)
{
this.age = age;
}
Person(String name)
{
this.name = name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public void speak()
{
System.out.println("name="+this.name+"...age="+this.age);
this.show();
}
public void show()
{
System.out.println(this.name);
}
/*
需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
*/
public boolean compare(Person p)
{
return this.age==p.age;
}
}
5、static关键字
static关键字用于修饰成员(成员变量和成员函数)
被修饰的成员具有以下特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用。类名.静态成员。
实例变量和类变量的区别:
1.存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2.生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
注意:
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
利弊:
利处:对对象的共享数据进行单独空间的存储,节省空间。
没有必要每个对象中都存储一份。
弊端:生命周期过长。访问出现局限性。静态只能访问静态。
成员变量也叫实例变量。
静态的成员变量也叫类变量。
public static void main(String[] args)
主函数:是一个特殊的函数。是程序的入口,可以被jvm调用。
定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载而加载。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被虚拟机识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
固定格式。
静态的应用:
每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。
静态代码块:
格式:
static
{
//代码
}
特点:随着类的加载而执行,但只执行一次,并优先于主函数和构造代码块。用于给类进行初始化的。
静态变量:
当分析对象中所具备的成员变量的值都是相同的,这时这个成员就可以被静态修饰。只要数据在对象中
都是不同的,就是对象的特有数据,必须存储在对象中,定义成静态的。
静态函数:
函数是否用静态修饰,就参考一点,就是该函数功能是否访问到对象中的特有数据。
静态函数只能访问静态方法或者静态变量。
-----------------------------------
Person p = new Person("zhangsan",20);
该句话:
1.因为new用到了Person.class。所以会先找到Person.class文件并加载到内存中。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给栈内存中的p变量。
-------------------------------------
6.单例设计模式
单例设计模式:解决一个类在内存只存在一个对象。
饿汉式
public Single()
{
private Single(){}
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
懒汉式
public Single()
{
private Single(){}
private static Single s = null;
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;
}
}
7、值传递和引用传递的区别
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。