黑马程序员_面向对象(1)

------- android培训、java培训、期待与您交流! ----------

第三章:面向对象(1)

第一部分:

1、什么是面向对象?

1.1、概念

  • 面向对象是是一个抽象的概念,它相对的面向过程而言。
  • 面向过程:强调的是功能行为,一种过程,先做什么,后做什么。
  • 面向对象:将功能封装到对象里,强调的是具备某功能的对象;

1.2、举例理解

1.2.1、把大象放进冰箱需要分成3步:打开冰箱、把大象放进冰箱、关上冰箱;这些都是强调的过程,这个是一个标准的面向过程的例子;
1.2.2、面向对象强调的是对象,找到冰箱,那么冰箱的所有功能就找到了;
1.2.3、移动窗口,最小化窗口、关闭窗口;强调的是过程;面向过程
1.2.4、窗口移动,窗口最小化,窗口关闭;强调的是窗口;面向对象;
1.2.5、人开门;开门这个动作是门的行为,门里面有轴,门怎么开的,门是最清楚的,人只是给门的一个打开的信号。
1.2.6、买电脑;
1.2.7、公司招聘人;
1.2.8、人在黑板上画圆
  • 名词提炼:对象:Person,blackboard,circle;
  • 有一个画圆的动作,画圆这个动作里面,用到了圆心,还有半径,所以要知道圆心和半径,才能把圆给画出来,而圆心和半径都是圆里面的数据,画圆的方法要操作圆心和半径这个数据,这两个数据在哪个对象的身上,是在圆身上具备的,所以是画圆的方法提供的;
1.2.9、列车司机紧急刹车
1.2.10、两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子;
1.2.11、一个小球从绳子的一端移动到了另一端;
1.2.12、售货员正在统计售票小票上面的数据;
  • 对象提炼:售货员、小票;
  • 统计小票上的金额方法是售货员提供的,是票据自己算的,买的商品金额是多少是在这个小票里面,售货员只是调用了售货票据的getTotalMony(),这个方法;该方法是小票提供的;

1.3、图形理解

1.4、用代码的形式体现人开门

人开门:名词提炼法:把名词提炼出来封装成对象;
人
{
	开门(门)
	{
		门.开();
	}
}
门
{
	门(){操作门轴}
}

1.5、面向对象的好处

  • 把复杂的问题简单化;
  • 从以前的执行者过度到了现在了指挥者;

1.6、总结

面向对象设计:谁拥有数据,谁就对外提供操作这些数据的方法,把数据私有化了,以后要对这些数据,如修改或者删除;

2、面向对象的特征:

面向对象的三个特征:
  • 封装
  • 继承
  • 多态

3、类和对象的关系

3.1、类:现实生活中事物的描述;
3.2、对象:这类事物实实在在存在的个体;
3.3、在java中描述是通过类的形式类体现的;
3.4、对象在java中是通过new操作而产生的一个实实在在的实体,该实体在堆内存中;
3.5、凡是数据多了,用实体来存储,对象也是用来存储数据用的,凡是用来存储数据的,都称为实体,都放在堆内存中;
3.6、通过图列来描述类和对象的关系
  • 描述汽车:汽车是通过图纸生产出来的,图纸就是汽车事物的描述,而通过图纸生产出来的都是实实在在的个体,图纸定义的是红色。有4个轮胎,每一个个体都具备演的和轮胎数;

  • 对一个事物的描述就是在描述两个部分:第一个是事物的属性,第二个是事物的行为;
  • 属性对应的是类中的变量,行为对应的是类的函数(方法);
  • 其实定义类就是在描述事物,就是在定义属性和行为,属性和行为又共同成为类中的类中的成员,成员包括成员变量和成员函数;
  • 属性-->成员变量
  • 行为-->成员函数

4、成员变量和局部变量

成员变量:定义在函数外面的变量,成为成员变量;
特点:它们作用的范围不同,成员变量作用于整个类中,局部变量作用函数中或者for语句中,此外:在内存中的位置也是不同的,成员变量在堆内存中,因为对象的存在,才在内存中存在,而局部变量存在于栈内存中;

5、匿名对象

5.1、概念:顾名思义就是一个没有名字的对象,创建一个对象出来,没有赋给一个变量;
5.2、特点:
  • 对方法或者字段只进行一次调用;
  • 可以作为实际参数进行传递;
  • 只能在堆内存里面开辟存储空间;
5.3、举例:
class CarDemo 
{
	public static void main(String[] args) 
	{
		new Car().num =5;//匿名对象就是没有名字的对象
		new Car().color  ="blue";//使用一次后就消失了;
		new Car().run();
	}
}


5.4、匿名对象的使用方式

  • 当对对象的方法只调用一次的时候,可以用匿名对象完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字;
  • 可以将匿名对象作为实际参数进行传递;

6、封装

6.1、含义:是指隐藏对象的属性和实现细节,仅对外提供 公共访问方式。
6.2、好处:
  • 将变化隔离。
  • 便于使用。
  • 提高重用性。
  • 提高安全性

6.3、代码体现

class Person
{
	private int age;
	public void setAge(int a)
	{
		if(age>0 && age<130)//如果判断成功了,就调用speak方法
		{
			age =a;
			speak();
		}
		else
		{
			System.out.println("feifa age");
		}
	}
	public int getAge()
	{
		return age;//返回一个age,需要一个return。
	}
	public void speak()
	{
		System.out.println("age="+age);
	}
}
class PersonDemo 
{
	public static void main(String[] args) 
	{

		Person p = new Person();

		//p.age =20;
		p.setAge(50);
		p.speak();
	}
}

7、构造函数

7.1、特点:

  • 函数名与类名相同
  • 不用定义返回值类型
  • 不可以写return语句

注意:构造函数的特点是:函数名和类名是相同的,是不需要定义返回值类型的,和void不相同,void是没有具体的返回值类型;

7.2、对象一建立就调用与之对应的构造函数;

7.3、构造函数的作用:可以用于给对象进行初始化;也就是说当在堆内存中产生对象,这个对象需要一个初始化动作;比如:人一初始化就会哭,哭就是人的初始化行为;

7.4、构造函数的一个小细节:

当yield类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的狗仔函数,叫做Person(){}---->方便对象初始化,分i在对象是建立不出来的;当在类中自定义了构造函数时默认的构造函数就没有了;

7.5、用代码描述人:


class Person
{
	private String name;
	private int age;
	//构造代码快。每个构造函数的对象都要执行,
	{
		//System.out.println("person code");
		cry();
	}
//   对不同的构造函数分别进行初始化;
	Person()
	{
		System.out.println("name="+name+",,,age="+age);
	}
//	重载
	Person(String n)	
	{
		name = n;
		System.out.println("name="+name+",,age="+age);
	}
	public void setName(String n)
	{
		name =n;
	}
	public String getName()
	{
		return name;
	}
	Person(String n,int a)
	{
		name = n;
		age = a;
		System.out.println("name="+name+",,,age="+age);
	}
	public void cry()
	{
		System.out.println("cry");
	}
}
class PersonDemo2 
{
	public static void main(String[] args) 
	{
		Person p1 = new Person();
		//p1.cry();//一般方法。
		Person p2 = new Person("zhangsan");
//		p2.setName("zhangsansan");
//		p2.setName("zhangsansan33333");
//		System.out.println(p2.getName());
		Person p3 = new Person("lisi",49);
	}
}

运行后的结果:


7.6、注意:

在描述人的时候,人这个对象一产生,要么有年龄,要么有姓名,不可能出现没有姓名,没有年龄的情况;

7.7、构造函数和一般函数的区别:

构造函数和一般函数在写法上有不同;

在运行上也有不同,构造函数是对象一建立就运行,给对象初始化,而一般方法的是对象调用才运行,是给对象具备的功能,一个对象建立,构造函数只运行一次,而一般方法可以被对象调用多次;

7.8、什么时候定义构造函数呢?

当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中,构造函数在进行定义时;

7.9、构造代码块

作用:给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;

构造代码块和构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象进行初始化;

有的孩子是有名字,有的孩子是没名字的,但是不管你有名字还是没名字,都要执行构造代码块;

8、this关键字

8.1、this关键字貌似是用来区分局部变量和成员变量;

要将后面的name赋给对象中的name,最终是把具体值赋给某一个对象里面的name,真正运行的是对象,举例:用图纸造汽车,正真开上马路=的是汽车,也就是对象,

8.2、this代表的是本类中的对象;本类中有那么的对象,到底代表哪一个?

this代表它所在函数所属对象的引用;简单的说:哪个对象在调用this所在的函数,this就代表哪个对象;

8.3、代码表示:


class Person
{
	private String name;
	private int age;
	Person()
	{
		System.out.println("name="+name+",,,age="+age);
	}
	Person(String name)	
	{
		this.name = name;
	}
	Person(int age)
	{
		this.age = age;
	}
	Person(String name,int age)
	{
//		this.name = name;//this,谁调用我,我就代表谁。
		this(name);//this语句
		this.age = age;
		System.out.println("name="+name+",,,age="+age);
	}
	public boolean compare(Person p)
	{
		return this.age==p.age;//p2传给了p。
	}

	public void speak()
	{
		System.out.println("name="+name+",,age="+age);
		
	}
}
class PersonDemo4
{
	public static void main(String[] args) 
	{
		Person p1 = new Person("lisu",24);
//		Person p2 = new Person(24);
//		boolean  b = p1.compare(p2);
//		System.out.println(b);
//		p1.speak();
		//p1.cry();//一般方法。
//		Person p2 = new Person("zhangsan");
//		p2.setName("zhangsansan");
//		p2.setName("zhangsansan33333");
//		System.out.println(p2.getName());
//		Person p3 = new Person("lisi",49);
	}
}

this语句:用于构造函数之间调用this(name)---->this语句;

构造函数间调用只能用this语句,调用时要传相对应的参数;

this语句只能定义在构造函数的第一行,因为被初始化动作要先执行;

发布了40 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/java9832/article/details/46387677
今日推荐