黑马程序员_java基础--面向对象(1)
2014-06-09 19:18
197 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!
----------
面向对象:
1、面向对象思想:
(1)概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象;
(2)思想特点:
A:是符合人们思考习惯的一种思想;
B:将复杂的事情简单化了;
C:将程序员从执行者变成了指挥者;
比如我要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机,至于怎么洗我不管。
(3)特征:
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
继承:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
多态:
一个对象在程序不同运行时刻代表的多种状态,父类或者接口的引用指向子类对象
2、类和对象:
类:对现实世界中某类事物的描述,是抽象的,概念上的定义。
对象:事物具体存在的个体。
定义类,就是在描述事物,就是在定义属性和行为。
3:成员变量和局部变量的区别(重点)
(1)作用域
成员变量:针对整个类有效。
局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
(2)存储位置
成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。
当方法调用完,或者语句结束后,就自动释放。
(3)初始值
成员变量:有默认初始值。
局部变量:没有默认初始值,使用前必须赋值。
4、匿名对象
(1)匿名对象就是没有名字的对象。是对象的一种简写形式。
(2)应用场景
A:只调用一次类中的方法。
B:可以作为实际参数在方法传递中使用
例:
5、封装:
指隐藏对象的属性和实现细节,仅对外提供公共访问方式;比如电脑机箱、笔记本等
好处:
将变化隔离;
方便使用;
提高复用性;
提高安全性
6、关键字private:封装在代码中的体现
(1)私有的意思,权限修饰符
(2)用来修饰成员变量和成员函数
(3)用private修饰的成员只在本类中有效,只能在本类中访问。
(4)私有是封装的一种体现
之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作,提高代码健壮性。
7、构造方法:
(1)特点:
方法名与类名相同
没有返回类型
没有返回值
(2)作用:构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应的构造函数,
(3)构造方法的注意事项:
A:如果一个自定义类没有构造方法,系统会默认给出一个无参构造方法。
B:如果一个自定义类提供了构造方法,那么,系统将不再给出无参构造方法。
这个时候,你可以不使用无参构造方法。
如果你想使用,那么,就必须手动给出无参构造方法。
建议:一般情况下,我们的自定义类都要手动给出无参构造方法。
(4)构造方法和成员方法的区别:
A:格式区别
构造方法和类名相同,并且没有返回类型,也没有返回值。
普通成员方法可以任意起名,必须有返回类型,可以没有返回值。
B:作用区别
构造方法用于创建对象,并进行初始化值。
普通成员方法是用于完成特定功能的。
C:调用区别
构造方法是在创建对象时被调用的(一建立就运行),一个对象建立,只调用一次相应构造函数
普通成员方法是由创建好的对象调用,可以调用多次
默认构造函数的权限随类的变化而变化。
一个类中默认会有一个空参数的构造函数。这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰。
如果类没有被public修饰,那么默认的构造函数也没有public修饰。
8、构造代码块:
(1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
(2)构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一初始化
构造函数是给对应的对象进行初始化
9、this关键字
(1)this关键字代表本类对象的一个引用,谁调用this所在的方法,this就代表谁
(2)this的使用场景
A:用于区分同名成员变量和局部变量;
B:在定义函数时,该函数内部要用到调用该函数的对象时,因为此时对象还没建立,故this代表此对象
B:构造函数间调用
**这个时候,this(参数)必须作为第一条语句存在。(因为初始化要先执行)
10、Person p = new Person();在内存中做了哪些事情。
(1)将Person.class文件加载进内存中。
(2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
(3)在堆内存给对象分配空间。
(4)对对象中的成员进行默认初始化。
(5)对对象中的成员进行显示初始化。
(6)调用构造代码块对对象进行初始化。(如果没有就不执行)
(7)调用构造方法对对象进行初始化。对象初始化完毕。
(8)将对象的内存地址赋值给p变量,让p变量指向该对象。
11、static关键字:
(1)静态的意思,用来修饰成员变量和成员函数
(2)静态的特点:
随着类的加载而加载-->也就是说,静态会随着类的消失而消失,说明它的生命周期最大
优先于对象存在-->明确一点:静态是先存在,对象是后存在的
对所有对象共享
可以被类名直接调用
例:
info()方法是静态方法,它并不是Demo对象,而是属于Demo类,虽然程序中使用了d变量来调用这个info()方法,但是,实际底层依然是使用Deno类作为主调来调用该方法,因此,可以看到程序正常输出。
注: 被static关键字修饰的成员属于类本身,而不是单个的java对象。
(3)静态的注意事项
A:静态方法只能访问静态成员
为什么:因为静态的内容是随着类的加载而加载,它是先进内存的。
B:静态方法中不能使用this,super关键字(因为静态优先于对象存在,所以静态方法中不可以出现this,对象还没建立,访问不到的)
C:主方法是静态的
public
static void main(String args[])
public:公共的意思,是最大权限修饰符。(固定格式,jvm识别)
static:由于jvm调用main方法的时候,没有创建对象。(static代表主函数随着类的加载就已经存在了)
只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名
public static void main(int x) 重载
可以同时存在,但是程序的入口还是:public static
void main(String args[])
JVM只识别这个固定的。
(4)静态变量和成员变量的区别
A:调用方式
静态变量也称为类变量,可以直接通过类名调用。也可以通过对象名调用。
这个变量属于类。
成员变量也称为实例变量,只能通过对象名调用。这个变量属于对象。
B:存储位置
静态变量存储在方法区长中的静态区。
成员变量存储在堆内存。(随着对象的建立而存在)
C:生命周期
静态变量随着类的加载而存在,随着类的消失而消失。生命周期长。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D:与对象的相关性
静态变量是所有对象共享的数据。
成员变量是每个对象所特有的数据。
(5)静态的优点和弊端
优点:
对对象的共享数据进行单独空间的存储,节省内存,没有必要每个对象都存储一份
可直接被类名调用
弊端:
生命周期过长,随着类的消失而消失
访问出现权限,即静态虽好但只能访问静态
(6)什么时候使用静态呢?
A:当所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。
B:当某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。
静态的生命周期比较长,所以一般不推荐使用。
(7)静态代码块
A:它只执行一次,它比main还先执行。
B:执行顺序
静态代码块--构造代码块--构造方法
静态的应用:
每个应用程序中都有共性的功能。
可以将这些功能进行抽取独立封装,以便复用。
Animal的info方法
上面info()方法是静态方法,静态方法属于类,而不是属于对象。因此当程序通过a1、a2来调用info()方法时,实际上都会委托声明a1、a2的类来执行。也就是说,不管是通过a1调用info()方法,还是通过a2调用info()方法,实际上都是通过Animal类来调用,因此两次调用info()方法的结果完全一样。
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!
----------
----------
面向对象:
1、面向对象思想:
(1)概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象;
(2)思想特点:
A:是符合人们思考习惯的一种思想;
B:将复杂的事情简单化了;
C:将程序员从执行者变成了指挥者;
比如我要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机,至于怎么洗我不管。
(3)特征:
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
继承:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
多态:
一个对象在程序不同运行时刻代表的多种状态,父类或者接口的引用指向子类对象
2、类和对象:
类:对现实世界中某类事物的描述,是抽象的,概念上的定义。
对象:事物具体存在的个体。
定义类,就是在描述事物,就是在定义属性和行为。
3:成员变量和局部变量的区别(重点)
(1)作用域
成员变量:针对整个类有效。
局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
(2)存储位置
成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。
当方法调用完,或者语句结束后,就自动释放。
(3)初始值
成员变量:有默认初始值。
局部变量:没有默认初始值,使用前必须赋值。
4、匿名对象
(1)匿名对象就是没有名字的对象。是对象的一种简写形式。
(2)应用场景
A:只调用一次类中的方法。
B:可以作为实际参数在方法传递中使用
例:
package it.heima.com.duixiang; public class CarDemo { public static void main(String args[]){ new Car().run(); //匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成, //这样写比较简化。如果对一个对象进行多个成员调用,必须给这个对象起个名字。 //匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。 show(new Car()); } public static void show(Car car) { car.num = 6; car.color = "black"; car.run(); } } class Car{ int num = 4; //描述轮胎数 String color = "red"; //描述颜色 //运行行为 void run(){ System.out.println("This car is "+color+",and its num is "+num); } }
5、封装:
指隐藏对象的属性和实现细节,仅对外提供公共访问方式;比如电脑机箱、笔记本等
好处:
将变化隔离;
方便使用;
提高复用性;
提高安全性
6、关键字private:封装在代码中的体现
(1)私有的意思,权限修饰符
(2)用来修饰成员变量和成员函数
(3)用private修饰的成员只在本类中有效,只能在本类中访问。
(4)私有是封装的一种体现
之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句。对访问的数据进行操作,提高代码健壮性。
7、构造方法:
(1)特点:
方法名与类名相同
没有返回类型
没有返回值
(2)作用:构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应的构造函数,
(3)构造方法的注意事项:
A:如果一个自定义类没有构造方法,系统会默认给出一个无参构造方法。
B:如果一个自定义类提供了构造方法,那么,系统将不再给出无参构造方法。
这个时候,你可以不使用无参构造方法。
如果你想使用,那么,就必须手动给出无参构造方法。
建议:一般情况下,我们的自定义类都要手动给出无参构造方法。
(4)构造方法和成员方法的区别:
A:格式区别
构造方法和类名相同,并且没有返回类型,也没有返回值。
普通成员方法可以任意起名,必须有返回类型,可以没有返回值。
B:作用区别
构造方法用于创建对象,并进行初始化值。
普通成员方法是用于完成特定功能的。
C:调用区别
构造方法是在创建对象时被调用的(一建立就运行),一个对象建立,只调用一次相应构造函数
普通成员方法是由创建好的对象调用,可以调用多次
默认构造函数的权限随类的变化而变化。
一个类中默认会有一个空参数的构造函数。这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰。
如果类没有被public修饰,那么默认的构造函数也没有public修饰。
8、构造代码块:
(1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
(2)构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一初始化
构造函数是给对应的对象进行初始化
9、this关键字
(1)this关键字代表本类对象的一个引用,谁调用this所在的方法,this就代表谁
(2)this的使用场景
A:用于区分同名成员变量和局部变量;
B:在定义函数时,该函数内部要用到调用该函数的对象时,因为此时对象还没建立,故this代表此对象
B:构造函数间调用
**这个时候,this(参数)必须作为第一条语句存在。(因为初始化要先执行)
10、Person p = new Person();在内存中做了哪些事情。
(1)将Person.class文件加载进内存中。
(2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
(3)在堆内存给对象分配空间。
(4)对对象中的成员进行默认初始化。
(5)对对象中的成员进行显示初始化。
(6)调用构造代码块对对象进行初始化。(如果没有就不执行)
(7)调用构造方法对对象进行初始化。对象初始化完毕。
(8)将对象的内存地址赋值给p变量,让p变量指向该对象。
11、static关键字:
(1)静态的意思,用来修饰成员变量和成员函数
(2)静态的特点:
随着类的加载而加载-->也就是说,静态会随着类的消失而消失,说明它的生命周期最大
优先于对象存在-->明确一点:静态是先存在,对象是后存在的
对所有对象共享
可以被类名直接调用
例:
public class Demo { public static void main(String args[]){ Demo d = null;//声明一个Demo变量,并将一个null赋给该变量。 d.info(); } public static void info(){ System.out.println("静态的info方法"); } }
info()方法是静态方法,它并不是Demo对象,而是属于Demo类,虽然程序中使用了d变量来调用这个info()方法,但是,实际底层依然是使用Deno类作为主调来调用该方法,因此,可以看到程序正常输出。
注: 被static关键字修饰的成员属于类本身,而不是单个的java对象。
(3)静态的注意事项
A:静态方法只能访问静态成员
为什么:因为静态的内容是随着类的加载而加载,它是先进内存的。
B:静态方法中不能使用this,super关键字(因为静态优先于对象存在,所以静态方法中不可以出现this,对象还没建立,访问不到的)
C:主方法是静态的
public
static void main(String args[])
public:公共的意思,是最大权限修饰符。(固定格式,jvm识别)
static:由于jvm调用main方法的时候,没有创建对象。(static代表主函数随着类的加载就已经存在了)
只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名
public static void main(int x) 重载
可以同时存在,但是程序的入口还是:public static
void main(String args[])
JVM只识别这个固定的。
(4)静态变量和成员变量的区别
A:调用方式
静态变量也称为类变量,可以直接通过类名调用。也可以通过对象名调用。
这个变量属于类。
成员变量也称为实例变量,只能通过对象名调用。这个变量属于对象。
B:存储位置
静态变量存储在方法区长中的静态区。
成员变量存储在堆内存。(随着对象的建立而存在)
C:生命周期
静态变量随着类的加载而存在,随着类的消失而消失。生命周期长。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D:与对象的相关性
静态变量是所有对象共享的数据。
成员变量是每个对象所特有的数据。
(5)静态的优点和弊端
优点:
对对象的共享数据进行单独空间的存储,节省内存,没有必要每个对象都存储一份
可直接被类名调用
弊端:
生命周期过长,随着类的消失而消失
访问出现权限,即静态虽好但只能访问静态
(6)什么时候使用静态呢?
A:当所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。
B:当某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。
静态的生命周期比较长,所以一般不推荐使用。
(7)静态代码块
A:它只执行一次,它比main还先执行。
B:执行顺序
静态代码块--构造代码块--构造方法
静态的应用:
每个应用程序中都有共性的功能。
可以将这些功能进行抽取独立封装,以便复用。
package it.heima.com.array; /* 虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作。 发现了问题: 1,对象是用于封装数据的,可是ArrayTool对象并未封装特有数据。 2,操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。 这时就考虑,让程序更严谨,是不需要对象的。 可以将ArrayTool中的方法都定义成static的。直接通过类名调用即可。 将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象的。 为了更为严谨,强制让该类不能建立对象。 可以通过将构造函数私有化完成。 */ //这是一个可以对数组进行操作的工具类,该类中提供了,获取最值,排序等功能。 class ArrayTool{ private ArrayTool(){} //获取最大值 public static int getMax(int[] arr){ int max = arr[0]; for(int i=0; i<arr.length; i++){ if(arr[i]>max) max = arr[i]; } return max; } //获取最小值 public static int getMin(int[] arr){ int min = arr[0]; for(int i=0; i<arr.length; i++){ if(arr[i]<min) min = arr[i]; } return min; } //选择排序 public static void selectSort(int[] arr){ for(int x=0; x<arr.length-1;x++){ for(int y=x; y<arr.length;y++){ if(arr[y]<arr[x]) swap(arr,x,y); } } } //置换数组中2个元素的位置 private static void swap(int[] arr, int a , int b){ int temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } //打印数组 public static void printArray(int[] arr){ System.out.print("["); for(int i=0; i< arr.length;i++){ if(i == arr.length-1) System.out.print(arr[i]); else System.out.print(arr[i]+","); } System.out.println("]"); } } public class ArrayToolDemo { public static void main(String args[]){ int[] x ={3,1,5,6,2,4,7,8,9}; int max = ArrayTool.getMax(x); System.out.println(max); ArrayTool.selectSort(x); ArrayTool.printArray(x); } }下面来看看一道程序题:
public class Wolf extends Animal{ public static void main(String args[]){ //定义一个Animal变量,引用到一个Animal实例 Animal a1 = new Animal(); a1.info(); //定义一个Animal变量,引用到一个Wolf实例 Animal a2 = new Wolf(); a2.info(); } public static void info(){ System.out.println("Wolf的info方法"); } } class Animal{ public static void info(){ System.out.println("Animal的info方法"); } }结果是:Animal的info方法
Animal的info方法
上面info()方法是静态方法,静态方法属于类,而不是属于对象。因此当程序通过a1、a2来调用info()方法时,实际上都会委托声明a1、a2的类来执行。也就是说,不管是通过a1调用info()方法,还是通过a2调用info()方法,实际上都是通过Animal类来调用,因此两次调用info()方法的结果完全一样。
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!
----------
相关文章推荐
- 黑马程序员——Java基础之面向对象(3)——第九篇
- 黑马程序员---Java基础--08天(面向对象之三多态)
- 黑马程序员_Java基础_面向对象(概述、类与对象关系、成员变量、封装private、构造函数和构造代码块、this关键字)
- 黑马程序员:java基础学习——面向对象
- 黑马程序员_Java基础_面向对象(内部类、异常1)
- 黑马程序员——Java基础之面向对象(4)——第十篇
- 黑马程序员_Java基础_面向对象(异常2、练习题、导包)
- 黑马程序员____基础____java的面向对象
- 黑马程序员_Java基础_面向对象(Static的使用、对象初始化和调用成员过程、单例设计模式)
- 黑马程序员-----笔记整理(java基础五-------面向对象--多态)
- 黑马程序员-Java语言基础–面向对象 第9天
- 黑马程序员-Java语言基础–面向对象 第5天
- 黑马程序员_Java基础_面向对象(继承、子父类变量和函数以及构造函数特点、final关键字、抽象类、模版方法模式、接口)
- 黑马程序员——Java基础之面向对象(1)——第七篇
- 黑马程序员---Java基础--07天(面向对象之三)
- 黑马程序员-Java语言基础 –面向对象 第7天
- 黑马程序员-Java语言基础–面向对象 第8天
- 黑马程序员-----java基础三(之面向对象)
- 黑马程序员_Java基础_面向对象(多态、Object类相关方法)
- 黑马程序员_java编程基础10面向对象