黑马程序员 java面向对象(一)


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

做个比喻 要完成把大象装冰箱这件事 我们以往的 做法是 把冰箱门打开大象塞里冰箱门关上。这是一个面向过程的做法。

现在我们换一个角度,对于 打开 存储 关闭 这都是冰箱的一个行为 我们只要操作冰箱之中的这些功能就行了。 哎 这个

冰箱是一个实实在在的东西,咱就把这个冰箱称为是对象。找找这个对象也就能完成了任务

同样是完成这个任务
面向过程:
打开冰箱,
存储进冰箱,
关闭冰箱,
这个要找这么多过程
面向对象
冰箱.打开; 冰箱.存储 ;冰箱.关闭
找的都是冰箱 简化了过程
小结
 面向对象的出现,将问题变的简单化了

举例 大象装冰箱, 门开,买电脑,公司招人开发。这几个列子

分析一句话里面有几个对象可以用名词提炼法 
  比如说 人开门
人{
   开门 (门)
 {
   门.开();
  }
 }
 门{
         开(){操作门轴等};
  }


面向对象的三个特征 

封装 继承 多态  


以后开发其实就是找对象使用 没有对象就创建一个对象
想要实现一个功能的时候要时刻想着 
找对象 创建对象 使用对象 维护对象的关系。 

类和对象的概念和联系。 
类就是对现实生活中实物的描述 
对象 就是这类实物 实实在在存在的个体 
现实生活中的对象 张三 李四
想要描述: 提取对象中的内容,对具体的抽象。 
描述时 这些对象的共性有: 姓名 年龄 性别 学习java的功能等

映射到java中就是class定义的类
具体对象 就是对应java在堆内存中用new建立实体(存储很多数据的一般都放在堆中)

需求 描述汽车  描述事物其实就是在描述事物的属性和行为 
定义类 其实就是在描述事物 就是在定义属性和行为 属性和行为有共同成为类中的成员(成员变量,成员函数);
class Car 
{
   String color = "红色";
   int num = 4;
   
   //行为 有个运行的行为
   void run()
   {S.O.P(color+ ".."+num); }

}


主函数中生产汽车了  在java中用过new操作符来完成 其实就是在堆内存中产生一个实体 
做法Car c= new Car();
(在学数据类型的时候 类型分为两大类 一个是基本的8种 一个是引用的有三种 已经讲过了一个数组了)
这个时候 c 就是一个类类型变量 (引用型的)它只想的是对象 
对类型中的对象都有一个共同的特点就是初始化的时候是 有值的null 
需求 当已有的车的颜色改成蓝色
只会对象做使用了,在java指挥的方式是  对象.对象成员
c.color ="blue";
多个引用可以指向同一个对象
局部变量和成员变量
作用范围 
成员变量作用于整个类中, 局部变量作用局函数或者语句中 
在内存中的位置 
成员变量在堆内存中 因为对象的存在才在内存中存在
局部变量在栈内存中
还可以在car那个里面写个主函数表示 这个类可以独立执行,但是一般不会写 
成员变量都有默认值 不初始化的时候会死可以参与运算的, 局部变量不初始化是不能参与运算的。

匿名对象。 

调用方法匿名对象是有意义的 调用属性石没意义的

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

show(new Car());这种方式

正常可以表示为

Car q = new Car();
show(q);


封装 就是隐藏对象的属性和实现细节仅仅对外提供公共访问方式。 封装的出现 隔离了变化

 便于使用 提高了使用性 提高了安全性  

封装的原则 
 将不需要对外提供的内容都隐藏起来
 把属性都隐藏,提供公共方法对其访问。


private 私有,权限修饰符,用于修饰类中的成员 (成员变量,成员函数) 似有只有在本类中有效  将age私有化后 (private int age ;)类以外即使建立了对象也不能直接访问 但是人是由年龄的 需要在person类中提供对age的访问  这个时候就可以在这里面编写一个方法 来访问age 别的函数调用的时候 调用这个方法
封装不是私有 私有 仅仅是封装的一种表现形似。
注意
把属性私有化是为了不让你直接访问,之所以对外提供访问的方法是因为为了控制你如何访问提高代码的健壮性 在给提供的方法中作出判断 

构造函数 
1函数名于类名相同  
2不需要定义返回值类型
3不可以写return语句


对象一建立就会调用对应的构造函数 
构造函数的作用可以用于给对象初始化
构造函数的小细节 
当一个类中没有定义构造函数时,系统会默认给该类添加一个空参数的构造函数 否则对象是建立不出来的 
当在类中自定义了构造函数后 默认的构造函数就没有了

构造函数和一般函数在写法上有不同 
在运行杀那个也不同
构造函数式对象在一家里就运行给对象初始化 一般方法是对象调用才执行时给对象添加对象具备的功能  
一个对象建立构造函数只运行一次 一般方法可以被该对象调用多次  什么时候定义构造函数呢
当分析事物时 该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中


构造代码块 作用 给对象进行初始化  对象 已建立就运行 优先于构造函数执行 
构造代码块是给所有对象进行统一初始化 而构造函数是给对应的对象进行初始化 它定义的当然是不同对象的共性初始化内容(面试或许会考

类中的所有函数私有化了 则类是不能创建对象的
  private String name;
	private int age;
	Person(int age)
	{
		age = age;
	}
	Person(String name)
	{
		name = name;//局部中已经定义过一个name 的话 这两个name都是局部的


	}


怎么区分呢 用this  this为什么可以解决这个问题呢 this到底代表的是什么呢 
this 就代表本类对象 那到底代表哪一个呢  this 代表它所在函数所属对象的引用  简单说哪个对象this所在的函数 this就代表哪个对象  
this关键字看上去是用于区分局部变量和成员变量同名的情况 

this关键字的基本应用 当定义类中函数式 该函数内部要用到调用该函数的对象时,这时用this 来表示 这个对象。
但凡本类功能内部使用到了本类对象都用this表示 

this语句只能放在构造函数的第一行,因为初始化动作要先执行 且执行一次

static 

 静态修饰内容被对象所共享
当成员被静态修饰后,就多了一个调用方法,除了可以被对象调用外,还可以直接被类名调用,写法是类名.静态成员 
被static存放在 方法区(也叫共享区 数据区 )
特有数据随着对象而存储 
static的特点 
1 随着类的加载而加载 也就是说静态会随着类的消失而消失 生存周期是最长的 (静态的成员变量两称作类变量)
2优先于对象而存在不建议定义过多的静态变量 静态时先存在的对象是后存在的
3被所有对象所共享
4可以直接被类名所调用
示例变量和类变量
1类变量随着类的加载 存在于方法区中
实例变量随着对象的建立而存在于堆内存中,
2生命周期
类变量生命周期最长随着类的消失而消失 
实例变量随着对象的消失而消失 

静态变量的使用注意事项
静态方法只能访问静态成员 
非静态方法既可以访问静态也可以访问非静态
2 静态方法中不可以定义this super关键字,因为静态优先于对象存在所以静态方法中不可以出现this字样 。
3 主函数是静态的
静态有利有弊 利 对 对象共享数据 进行单独空间的存储 节省空间,没有必要每个对象中都存在一份。可以直接被类名调用
弊端 生命周期过长,访问出现局限性,(静态虽好,只访问静态)
主函数

是一个特殊的函数 作为程序的入口可以被jvm调用
主函数的意义, public代表着该函数的访问权限是最大的。
static 代表着主函数随着类的加载就已经存在了
void 主函数没有具体的返回值
main不是关键字 是一个特殊的单词 可以被jvm识别
函数的参数(Sting[] ags)参数类型是个数组该数组中的元素师字符串,字符串类型的数组、
主函数是固定格式的jvm识别
jvm在调用主函数是,传入的是new String[0]

什么时候使用静态

要从两方面下手,因为静态修饰的内容有成员变量和函数
什么时候定义静态变量呢(类变量)
当对象中出现共享数据时
对象中的特有数据要定义成非静态存于堆内存中
什么时候定义静态函数呢 
当功能内部没有访问到静态数据(对象的特有数据)
那么该功能可以定义成静态的
静态的应用工具类 
  每一个成俗中都有共性的功能可以讲这些功能进行抽取独立封装以便复用
对象是用于封装数据的可是arraytool对象并未封装特有数据 
2 操作数组的每一个方法都没有用到arraytool对象中的特有数据这时就考虑 

让程序更严谨是不需要对象的可以讲arraytool中的方法都定义成静态的 直接通过类

名调用即可  将方法静态后可以方便使用,但是该类还是可以被其他程序建立对象的,

为了更加严谨强制该类不能建立对象 可以通过将构造函数初始化来完成
深刻贯彻能不提供出去的 就给他私有化 

帮助文档的制作 
将制作好的arraytool.class文件发送给他人用,只要将该文件设置到classpath路径下就可以

使用该工具类了 但是 这个类中到底定义了多少个方法 其他人是不清楚的 那么我们就要在制作

完成后 标示出这个类中的方法  这就是帮助分档
格式如下
表头

/*
这是一个XXXX的工具类,该类中提供了XXX XXX等功能
@author 张三 
@version v1-1

*/ 


在各个功能模块上面注释  简述该功能 
示例
public class ArrayTool
{
	/**
	空参数构造函数。
	*/
	private ArrayTool(){}


	/**
	获取一个整形数组中的最大值。
	@param arr 接收一个int类型的数组。
	@return 会返回一个该数组中最大值。
	*/
	public static int getMax(int[] arr)
	{
		int max = 0;
		for(int x=1; x<arr.length; x++)
		{
			if(arr[x]>arr[max])
				max = x;
		}
		return arr[max];
	}
	
	/**
	获取一个整形数组中的最小值。
	@param arr 接收一个int类型的数组。
	@return 会返回一个该数组中最小值。
	*/
	public static int getMin(int[] arr)
	{
		int min = 0;
		for(int x=1; x<arr.length; x++)
		{
			if(arr[x]<arr[min])
				min = x;
		}
		return arr[min];
	}
}


要把一个类生成帮助文档的话类必须要 public修饰

文档注释都写完的时候我们可以用一个工具把文档注释提取出来 支撑说明书 
javadoc -d myhelp -author -version Arraytoll.java 
(myhelp 是帮助文档存放的目录  如果要加上作者或者版本的话则加 -author -version  不需要就不加这俩)
之后
顺利生成后看到myhelp文件件 点开 index.html就惊喜了
一个类中会有一个默认的一个空参数的构造函数
这个默认的构造函数的权限和所属类一直 如果累被public修饰,那么默认的构造函数也带public修饰符,

如果类没有被public修饰那么默认构造函数,也没有public修饰
默认构造函数的权限是随着类的变化而变化的。

静态代码块
格式
static
{
  执行语句 
}
静态代码块什么时候执行呢 
特点 随着类的加载而执行,只执行一次并优先于主函数执行 用于给类进行初始化的 
静态代码块只能访问的静态的 
Person p = new Person("zhangsan",20);
该句话都做了什么事情?
1因为new用到了person.calss 所以会先找到person.class文件并加载到内存
2 执行该类中的static代码块 如果有的话给 person。class类进行初始化
3 在堆内存中开辟空间 分配内存地址
4 在堆内存中建立对象的特有属性,并进行默认初始化。
5对属性进行显示初始化,
6对对象进行构造代码块初始化
7对对象进行与之队形的构造函数初始化
8将内存地址赋给栈内存中的P变量
对象调用成员过程
非静态前面省略的是 this.  
静态前面省略的是 类名.

设计模式 
解决某一类问题最行之有效的方法 
java中有23种模式
单列设计模式 解决一个类在内存中只存在一个对象。
想要保证对象唯一
1 为了避免其他程序过多建立该类对象,先控制禁止其他程序建立该类对象
2 还为了让其他程序可以访问到该类对象,只好在本类中 自定义一个对象。
3为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式
这三部用代码体现,

1 将构造函数私有化  private int age 
set get 方法 
2 在类中创建一个本类对象,
 private static Student s = new Student;
3提供一个方法可以获取到该对象
 public Static Student getStudent(){return s};
--------------
这个是先初始化对象 成为俄汉式
class Single
{
	private static Single s = new Single();
	private Single(){}
	public static Single (返回值类型是single)getInstance()
	{
		return s;
	}
}
对于事物该怎么描述 还怎么描述,当需要将该事物的对象保证在内存中唯一是,加上散步即可 

单例模式第二种 

懒汉式和俄汉式的区别
这个面试的时候常考 
/*

俄汉式 (上去就做)
一进内存就创建了对象
 懒汉式  (刚开始不做 什么时候需要什么时候做)
single类进内存 对象还没存在,只有调用了getInstance的时候才建立对象
懒汉式一个人调用没事儿 多人调用的时候可能会出现问题
cpu会来回切换这个
if(s==null)
 -->1
 -->2
 --->3
s = new Single();
最终解决方案 
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
也还是麻烦 


结论
实际编程的时候用俄汉式 安全简单。


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值