属性:对应类中的成员变量。
行为:对应类中的成员函数。
二. 成员变量与局部变量
(1)成员变量
1. 成员变量定义在类中,在整个类中都可以被访问。
2. 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3. 成员变量有默认初始化值。
(2)局部变量
1. 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2. 局部变量存在于栈内存中。
3.作用的范围结束,变量空间会自动释放。
4. 局部变量没有默认初始化值。
三.匿名对象
匿名对象是对象的简化形式。
匿名对象两种使用情况:
1、当对对象方法仅进行一次调用的时。
2、匿名对象可以作为实际参数进行传递。
封装
一.封装的概念
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
用 private关键字修饰类中的成员(成员变量,成员函数),将成员变量私有化,对外提供对应的set,get方法对其进行访问。提高对数据访问的安全性。
二.封装的好处
(1)将变化隔离
(2)便于使用
(3)提高复用性
(4)提高安全性
三.封装的原则
(1)将不需要对外提供的内容都隐藏起来
(2)把属性都隐藏,提供公共方法对其访问
例子:
package day18;
class Person1//描述人物对象的类
{
private int age;//人对象的年龄属性
public void setAge(int a)//提供访问方法,并判断是否有效
{
if(a>0 && a<130)
age = a;
else
System.out.println("年龄超出范围");
}
public int getAge()//提供获取方法
{
return age;
}
public void speak()
{
System.out.println("age="+age);
}
}
class Demo1
{
public static void main(String[] args)
{
Person1 p = new Person1();//创建人物对象
p.setAge(30);//利用封装提供的访问方法进行修改年龄属性
p.speak();
}
}
构造函数
一.特点、作用
(1)特点:
类名与函数名相同
不用定义返回值类型
不用写return语句
(2)作用:
给对象初始化
二.构造函数与一般函数的区别
(1)构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。对象创建时,会调用并且只调用一次。
一般函数:对象创建后,需要函数功能时才调用。对象创建后,可以被调用多次。
(2)当一个类中没有定义构造函数时,那么系统就会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。
三.构造函数与构造代码块
(1)构造代码块给对象进行初始化。对象一建立就运行,而且优先于构造函数运行。
(2)构造代码块是给所有对象进行初始化,构造函数是给对应的对象初始化。
关键字(this、static)
一.this关键字
(1) this代表它所在函数所属对象的引用。 简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
(2)当定义类中功能时,该函数内部要用到调用该函数的对象时用this来表示这个对象。本类功能内部使用到了本类对象,都用this表示。
(3) 用于构造函数之间进行互相调用。如:this(name);this语句只能定义在构造函数的第一行。因为初始化要先执行。
例子:
package day05;
/**
* this的两种用法(区分变量、函数间调用)
* @author Administrator
*/
class Person
{
private String name ;
private int age ;
Person(String name)
{
this.name = name;//通过this区分成员变量和局部变量
}
Person(String name, int age)
{
this(name);//this也可以用于在构造函数中调用其他构造函数
this.age = age;
}
public void speak(){
System.out.println(name + ":" + age );
}
}
class Demo1{
public static void main(String[] args)
{
Person p1 = new Person("zhangsan" );
p1.speak();
Person p2 = new Person("lisi" ,20);
p2.speak();
}
}
(1)static是个修饰符,用于修饰成员(成员变量和成员函数)。其特点为:
1.随着类的加载而加载
2.优于对象存在
3.被所有对象共享
4.可以直接被类名调用
(2)静态变量(类变量)与成员变量(实例变量)的区别;
1、存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2、生命周期。
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
(3)什么时候使用静态?
1、什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。
2、什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
(4) 静态使用注意事项:
1、静态方法只能访问静态成员。非静态方法既可以访问静态也可以访问非静态。
因为静态优先对象存在,非静态成员只有在对象建立后才存在。
2、静态方法中不可以定义this,super关键字。
因为静态优先于对象存在。所以静态方法中不可以出现this。
(5) 定义一个新对象都做了哪些事情?对象的初始化过程:
1、把类名.class文件加载到内存中。
2、执行该类中的static代码块,如果有得话,给该类进行初始化。
3、在堆内存中开辟空间,分配内存地址。给对象
4、在堆内存中建立对象的特有属性。并进行默认初始化。
5、对属性进行显示初始化。
6、对对象进行构造代码块初始化。
7、对对象进行对应构造函数初始化。
8、将内存地址赋给栈内存中的对象名变量。
单例设计
一.概念
设计模式:对问题行之有效的解决方式,其实它是一种思想。
单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性呢?
1、不允许其他程序用new创建该类对象。
2、在该类创建一个本类实例。
3、对外提供一个方法让其他程序可以获取该对象。
1、将构造函数初始化。
例:private Single(){} 将构造函数私有化的目的是不给外部建立对象
2、在类中创建一个本类对象。
例:private static Single s= new Single();
3、提供一个访问方法可以获取到该对象。
例:public static Single getInstance()
{
return s;
}
三.实例(1)饿汉式
class Single
{
private Single(){}
private static Single s=new Single();
public static Single getInstance()
{
return s;
}
}
它的特点是先初始化对象。如:
Single
类一进内存,就已经创建好了对象。在实际开发中,出于安全考虑,建议使用饿汉式。
(2)懒汉式
class Single
{
private Single(){}
private static Single s=null;
public static Single getInstance()
{
if(s==null)
s=new Single();
return s;
}
}
它的特点对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象。