一、面向对象
1、面向对象的概念
面向对象是相对面向过程而言的,面向过程是强调功能的过程行为,比如C语言,就大象放进冰箱的例子而言,面向过程是把冰箱打开;把大象放进去;关闭冰箱。二面向对象是冰箱打开;冰箱存储大象,冰箱关闭。典型的语言有Java,C++ ,C#等。
2、面对对象的特点
面对对象是是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。万物皆对象,种种事物都可以是对象。(注意面试的时候不要用)在实际编码中,不需要急着去做,先看看Java中有没有这个对象功能,如果对象不存在再去创建所需功能的对象。这样简化开发,提高了复用。
在Java开发中,就是不断的创建对象,使用对象,让对象干活,过程就是在管理和维护对象之间的关系。
面对对象有三个特征:封装,继承,多态。
二、类与对象
看下图:
如图所示:类就是图纸。汽车就是堆内存中的对象。
1、类与对象的关系:类是对象是社会这事物的描述,Java是用类class来描述对象的属性和行为。定义类其实就是在定义类中的成员(成员变量和成员函数)。属性:对应类中的成员变量。行为:对应类中的成员函数。对象就是这类事物实实在在存在的个体。具体对象就是存放在堆内存中用new建立的实体。
2、成员变量与局部变量
作用范围:成员变量作用于整个类,局部变量在函数中,也就是所在的大括号内。
在内存中的位置:成员变量位于堆内存中,因为对象存在,才在内存中存在。局部变量存在于栈内存中。
3、匿名对象
就是对象的简化方式。调用方法有意义。调用变量无意义。
什么时候使用匿名对象
(1)对象只进行一次操作。多次调用必须起名字。
(2)可以将匿名对象作为实际参数进行传递。
创建对象内存中发生了哪些事呢?
例如:Person p=new Person();
先将.class文件加载到内存;之后执行main方法,在栈内存中开辟了一个main方法空间,在main方法的栈里创建了一个变量p;接着在堆内存中开辟一个实体空间,并分配了一个内存的首地址;在实体空间中进行Person属性的空间分配,并进行默认初始化即各个属性值为null;接着对空间属性进行显示初始化即对各个属性赋值;最后将首地址值传给变量p。
三、封装(Encapsulation)
1、概念
封装就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2、好处
将变化隔离;
便于使用;
提高重用性;
提高安全性。
3、封装原则
把不要对外提供的内容隐藏起来。
把属性全部隐藏,对外提供公共的方法对其访问。
4、private(私有)关键字
private是一个权限修饰符。用于修饰成员(变量,函数),private修饰的成员只能在本类中使用。
常用方法:
将成员变量私有化,对外提供对应的set,get方法对其进行访问,这样提高了数据访问的安全性。
四、构造函数
1、构造函数的特点:名字与类名一致,不用返回值类型,不能使用return语句。
2、作用是给对象初始化。
如果一个类在定义时没有定义过构造函数,那么在类创建对象时会自己生成一个参数为空的构造函数,这就是默认构造函数;如果类中已经定义了构造函数了,那默认的构造函数就没有了。
下面是一个例子:
package com.itheima;
public class People {
/**
* @param args
* 第能以一个People类包含属性姓名,年龄
*/
private String name;
private int age;
//定义一个无参的构造函数
public People() {
// TODO Auto-generated constructor stub
System.out.println("我是无参构造函数");
}
//定义一个含参的构造函数
public People(String name,int age)
{
this.name=name;
this.age=age;
System.out.println("我是有参构造函数");
System.out.println("我的名字是"+name+",我的年龄是"+age);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建无参对象
People p=new People();
System.out.println("---------------------------");
//创建有参对象
People p1=new People("张三",22);
}
}
运行结果如图:
从结果可以看出,创建对象时,如果对象有参数传进去的话,就调用有参数的构造函数,无参数的函数就不会调用。这里用到了this函数。下面来说一下this关键字的使用。
五、this关键字
从上述代码中,成员变量与构造函数中的形参的名称是一样的都是name,那么怎么可以区分它们到底是那一个变量呢?在Java语言中规定了this这个关键字来代表本类对象的引用,this就用于引用本类的成员变量和方法了。上述代码中,this.name是指类People中的成员变量name,而等号右边name是指构造函数中形参name,这个函数的功能就是将形参name的值传递给了成员变量name。
this与对象的关系:this其实就是本类的一个对象,在局部变量或方法涵盖了成员变量是,就要添加this关键字来明确引用的是类的成员变量。
注意,如果不带this,就只是把参数赋值给参数变量本身而已,成员变量的值并没有改变;用this调用构造函数,必须定义在构造函数的第一行。因为构造函数是用于初始化的,所以初始化动作一定要执行。
另外,除了能调用本类的成员变量或成员函数之外,还可以作为返回值,即将类的对象返回。
this的调用方法:
this对象后面跟上 . 调用的是成员属性和成员方法(一般方法);
this对象后面跟上 () 调用的是本类中的对应参数的构造函数。
六、static关键字
被static修饰的变量,常量和方法被称为静态成员,静态成员属于类所有,当类加载时就存在,优先于对象存在,随着类执行完毕而消失,静态成员区别于个别对象,可以使用 类.成员 这个方法调用静态成员。
那么,什么时候需要static来修饰成员呢?
1、成员变量是否需要数据共享,即所有对象的这一属性都一样,是的话就需要用static修饰,否则就不用。
2、成员函数是否需要访问类中的特有数据(即private修饰过的),需要访问就不要static修饰,否则就需要。
具体请看下面这个例子:
package com.itheima;
public class StaticTest {
/**
* @param args
*/
//在类中定义静态常量
static double PI=3.1415;
//在类中定义静态变量
private static int id;
//在类中定义静态方法
public static void method1(){
System.out.println("我是静态函数");
}
public void method2()
{
System.out.println(StaticTest.PI);//调用静态常量
System.out.println(id);//调用静态变量
StaticTest.method1();//调用静态方法
}
public static void main(String[] args) {
// TODO Auto-generated method stub
StaticTest st=new StaticTest();
st.method2();
}
}
运行后的
效果图: