黑马程序员_java基础--面向对象(1)

来源:互联网 发布:kmp算法怎么理解 编辑:程序博客网 时间:2024/06/16 17:45

------- <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]);elseSystem.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>、期待与您交流! ----------

0 0
原创粉丝点击