------- android培训、java培训、期待与您交流! ----------
黑马学习日志之五 面向对象,类,函数,匿名对象,封装,构造函数,this,代码块
1 面向对象
1.1 面向对象的概念
面向对象是相对面向过程而言的,面向对象和面向过程都是一种思想。
面向对象强调对象,程序员是指挥者。面向过程强调过程,程序员是执行者。
面向对象是一种符合人们思考习惯的思想;可以将复杂的事情简单化;将程序员从执行者转换成了指挥者。面向对象将功能封装进对象,强调具备了功能的对象。
例子用来理解:
买电脑:
面向过程:查阅资料—去商城—砍价还价—买电脑
面向对象:找个懂电脑的朋友(对象),让他去买。
做菜:
面向过程:买菜、洗菜、做菜、吃饭、刷碗、倒垃圾;
面向对象:找了女朋友,让女朋友去做饭。女朋友就是对象。
注:
(1)面向对象的开发过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
(2)完成需求时:先要去找具有所需功能的对象来用;如果该对象不存在,那么创建 一个具有所需功能的对象;这样简化开发并提高复用。
(3)面向对象设计过程:就是在管理和维护对象之间的关系。
1.2 面向对象特征
封装,继承,多态。
2 类
2.1定义类
将一系列特征相似的对象的共同特征及行为抽取出来进行描述,写在一个class中,用成员变量描述对象的特征,用成员方法来描述对象的行为。
2.2类与对象关系
对象是类的实例,类是对象的抽象。
类是用来描述对象的。由于对象是虚拟出来的东西,是看不见摸不着的,我们需要在程序中使用对象,就需要用一种方式来描述对象,然后根据这个描述来创建对象。
比如:现实生活中的人这个抽象事物就是一个类,人类的属性姓名、年龄等是成员变量,人类的行为吃饭、睡觉等是成员方法。而张三就是人类的具体体现,是一个对象。
2.3 创建对象
格式:类名 对象名 = new 类名();
如: Person类中有一个zhangsan的对象。
Person zhangsan = new Person();
对象调用的格式: 对象名.成员变量 对象名.成员方法名()
如: zhangsan.name; zhangsan.sleep()
例子:
//创建一个学生类
class Student {
String name; // 成员变量 姓名
char sex; // 性别
int age; // 年龄
//成员方法 学习
public void study(){
System.out.println("学习");
}
//成员方法 /吃饭
public void eat(){
System.out.println("吃饭");
}
///成员方法 睡觉
public void sleep(){
System.out.println("睡觉");
}
}
class Demo {
public static void main(String[] args) {
//创建学生对象
Student stu = new Student();
//输出成员变量的默认值
System.out.println(stu.name + ".."+ stu.sex +"..." + stu.age);
//为成员变量赋值
stu.name = "张三";
stu.sex = '男';
stu.age = 80;
System.out.println(stu.name + ".."+ stu.sex +"..." + stu.age);
//使用成员方法
stu.study();
stu.eat();
stu.sleep();
}
}
注意:
Person p = new Person();
它在内存中做了哪些事情?
A:将Person.class文件加载到内存中。
B:在栈内存中声明Person类型的变量P。
C:在堆内存中创建一个对象Person。分配地址值
D:把Person中的属性进行默认初始化。
E:把Person中的属性进行显示初始化。
F:调用构造代码块(如果没有,不执行这个操作)。
G:调用构造函数进行初始化。
H:把堆内存的地址(引用)赋给了栈内存中P。
2.4 成员变量和局部变量区别
代码位置:
成员变量:在类中,方法外;
局部变量:在方法内
内存位置:
成员变量:在堆内存中;
局部变量:在栈内存中。
是否有默认值:
成员变量:有默认值,
局部变量:没有默认值;
使用范围:
成员变量:在类中的任何位置都可以使用,在整个类中都可以访问,
局部变量:只能在该方法中访问。
创建时间:
成员变量:随着对象的创建而存在,随着对象的释放而消失,生命周期长;
局部变量:随着方法的调用而存在,随着方法的消失而释放。
3 函数(方法)
3.1 函数的定义
函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。
3.2 函数的格式
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
执行语句;
return 返回值;
}
3.3 函数的特点
一般函数只有被调用后,才执行。
void 表示没有返回。在这个函数的结尾可以不写return。
其实jvm会自动的结尾处加上return;
3.4 定义自己的函数时注意:
明确该功能的结果 其实就是该功能的返回类型。
明确该功能的参数 其实就是明确该功能中是否需要未知内容(形式参数)参与运算。
明确未知内容的类型和个数。
3.5 函数的重载
函数名相同,参数列表不同。
参数类型不同。int add(int i)void add(double d)
参数个数不同。add(int a,int b);add(int a,int b,int c)
参数顺序不同 print(String name, int age)
重载特点:与返回值类型无关,只看参数列表。便于阅读,优化程序设计。
3.6 方法的调用:
定义方法参数:int x, int y 称为形式参数 形参
调用方法参数:100,300 称为实际参数 实参
调用方法必须使用实参。无返回值,直接调用 ;有返回值,有参数,要传参数。
4 匿名对象
我们可以不定义变量引用对象,使用new关键字创建对象后直接使用,这样的对象没有名字,所以叫匿名对象。
匿名对象因为没有任何引用到达,在使用一次之后即成为垃圾。
通常我们需要使用一个对象且只使用一次的时候,就可以使用匿名对象。比如将对象作为一个参数传递给另外一个函数。
例子:
class Person {
String name = "sss";
int age = 16;
public void show(){
System.out.println(name + "..." + age);
}
}
class Test {
public void method(Person p){
Person p2 = new Person();
p2.show();
p.show();
}
}
class AnonymityDemo {
public static void main(String[] args) {
//匿名对象的方式
new Person().show();
Test t = new Test();
//匿名对象的方式
t.method( new Person() );
}
}
5 封装
5.1 封装概念:
封装是指隐藏对象的属性(成员变量)和实现细节,仅对外提供公共访问(成员方法)方式。
封装能够将变化隔离;便于使用;提高重用性;提高安全性。
例子:老板找你做开发,你怎么做,老板不管,他只要最后的结果。
例子:
class Demo{
private int age;//把属性私有对外提供公共的访问方法,可控性提高了
/*
设置是setXxx要传参数
获取是getXxx要返回值类型,返回值类型和属性一致
*/
public void setAge(int age){// set一般返回值是void
if(age>=0 && age<=200)
this.age = age;
else
System.out.println("外星来的");
}
public int getAge(){ //get 一般返回值是age的类型 int
return age;
}
}
class DemoTest{
public static void main(String[] args) {
Demo d = new Demo();
d.setAge(50);
System.out.println(d.getAge());
}
}
5.2 private关键字
private关键字是一个权限修饰符,用于修饰成员(成员变量和成员函数),被私有化的成员只在本类中有效。对外提供对应的set、get方法对其进行访问,提高对数据访问的安全性。
私有只是封装的一种表现形式。
6 构造函数
特点:函数名和类名相同。
没有返回值类型。注意:没有返回值类型不等同于void,void也是一种返回值类型。不能使用return关键字返回任何值。
在使用new关键字创建对象之后自动调用。
作用:当创建对象的时候要调用构造函数,给对象进行初始化
格式:修饰符 类名(参数列表){}
空参构造函数 修饰符 类名(){}
注意:
(1)当java在类中没写构造函数,程序执行时,会自动添加没有参数的空参构造 函数。如果当前类中写了构造函数,那么,在程序执行的时候,JVM不会为 当前类添加空参数构造函数。
(2)当创建对象的时候,会调用构造函数,给创建出来的对象进行成员初始化。
(3)多个构造函数是以重载的形式存在的,调用构造函数时根据参数列表来区分 调用哪个构造函数
7 this关键字
this关键字:代表的是函数当前对象的引用,即代表其所在函数所属对象的引用。
this 关键字的使用:
(1)当局部变量与成员变量重名的时候,可以使用this关键字来区分。格式:this.成员 变量名。
(2)在构造函数中使用。构造函数之间调用只能通过this语句来调用。this语句只能 放在构造函数的第一行。
(3)当定义类中功能时,该函数内部要用到调用该函数的对象时,用this来表示这个 对象。
8 代码块
代码块就是通过大括号括起来
局部代码块:在方法中使用的代码块,
作用:可以控制变量的使用范围。
构造代码块:在类中使用的代码块(类中方法外)。
作用:可以给成员变量赋值,对象一建立就运行,在构造方法前执行。
执行顺序:构造代码块,构造方法,普通方法
例子:
class Person {
String name;
int age;
public Person(){
System.out.println(name +"..."+ age);
name = "cpp";
age = 24;
}
{
System.out.println(name +"..."+ age);
}
{
name = "sqq";
age = 23;
}
//普通方法
public void method(){
System.out.println(name +"..."+ age);
}
}
class CodeBlockDemo2 {
public static void main(String[] args) {
Person p = new Person();
p.method();
}
}