面向对象"/>
Java基础知识之面向对象
面试官问什么是面向对象?
面向对象基于面向过程,对象是对功能的封装,面向过程主要是凡事都亲力亲为,对于面向对象,其实面试官您就是按照面向对象的思想在思考问题,您本身就可以开发项目,但是项目有可能比较大,一个人开发的话,周期比较长,为了提高效率,需要有更多的具备专业开发能力的人来帮助你做事情,这个人就是您所需要的对象,只需要调用这些对象即可完成项目,省时省力,您要做的就是面向对象,指挥他们就行。
面向对象的好处
1.更加符合人们的思考习惯
2.面向过程中更多的体现执行者,面向对象 更多体现指挥者
3.使复杂繁琐的问题简单化
而且 万事万物皆对象
对象在代码中的体现
既然万事万物皆对象,那么对于生活中的任何一个实体,都是由属性+行为构成,而在代码中,变量就代表属性,函数就代表行为(功能)。下面以小汽车为例:
//定义一个Car类
class Car{String color;//颜色int number;//轮胎数void run(){//写一个run()方法System.out.println(color+":"+number);}
}
//写一个测试类
class CarTest{public static void main(String[] args){Car c=new Car();//创建Car的对象,给对象起个名字叫c。c是类类型的变量,指向了一个具体的Car类型的对象。c.color="red";//调用已有对象的功能格式:对象.对象的属性/方法c.number=4;//也可以给对象的属性赋值c.run(); }
}
对象的内存图解
类与对象的区别
类:用来将现实的事物抽象化,描述事物的属性和行为
对象:是类的一个实例
局部变量与成员变量的区别
1.定义的位置不同
*局部变量定义在方法中
*成员变量定义在类中
2.存储位置不同
*局部变量在栈内存中存储
*成员变量在堆内存中存储
3.初始化方式不同
*成员变量默认初始化
*局部变量必须手动给定初始值
4.生命周期不同
*局部变量随着方法的进栈而存在,随着方法的弹栈而消失
*成员变量随着对象的而存在而存在,随着对象的消失而消失
匿名对象
1.匿名对象的使用场景:
当对象对方法进行调用时,而且只调用一次时,可以简化为匿名对象来书写。
如:Car c=new Car();c.run();—>new Car().run();
即将为对象起名字的步骤直接省略
2.匿名对象也可作为参数传递:
class CarDemo{public static void main(String[] args){show(new Car());}public static void show(Car cc){cc.color="red";cc.number=4;cc.run();
}
基本类型和引用类型作为参数传递
1.基本类型作为参数传递
class Demo{public static void main(String[] args){int x=4;show(x);System.out.println("x="+x);}public static void show(int x){x=5;}
}
2.引用类型作为参数传递
class Demo{int x;public static void main(String[] args){Demo d=new Demo();d.x=5;show(d);System.out.println("x="+d.x);}public staitc void show(Demo d){d.x=6;}
}
当两个引用指向了同一对象,无论哪个引用改变了对象,这个对象的值都发生了改变。
封装
1.封装的表现:
- 函数就是一个最基本的封装体,是将具体功能封装到方法中
- 类也是一个封装体,但他是将方法封装起来
2.封装的好处:
- 提高了代码的复用性
- 隐藏了实现细节,还要对外提供可以访问的方式。便于调用者调用。
- 提高了安全性
- 是面向对象的三大特征之一。(面向对象的三个特征:封装、继承、多态)
3.封装的举例:
- 如电脑的主机,就是将CPU、主板、显卡、内存、硬盘、电源等部件用机箱壳子装起来,只对外提供了插口及开关等访问细节。试想,如果那些零部件都散落到外面,肯定会不安全。
private关键字的用法
class Person{private int age;private String name;public void setAge(int a){if(a<0||a>130){System.out.println(a+"不符合年龄的数据范围");return;//throw new RuntimeException}age=a;}//因为private关键字的使用会让外部既不能修改也不能访问该变量,因此提供getxxx()方法让外部对他可以访问public void getAge(){return age;}
}
- 因此,要将类中不需要对外提供的内容私有化,包含属性和行为。使用private关键字。
- 属性一般都私有化,并提供setxxx/getxxx方法对其访问
构造函数
1.定义:对象创建时应执行的函数
2.格式:
修饰符 函数名(参数列表){
}
3.特点:
- 无返回值类型,也没有返回值。因为他是为创建对象而写的函数,无需返回值,而且对象创建完后,构造函数也就执行结束。
- 构造函数名与类名一致
4.构造函数的调用和图解:
class Person{private int age;private String name;Person(int a,String n){age=a;name=n;}public void speak(){System.out.println("name="+name+",age="+age);}
}
class PersonDemo{public static void main(String[] args){Person p=new Person(21,"李明");}
}
1)将main函数压入栈中
2)在堆内存中分配一片内存空间0x234来存储Person对象,对成员变量默认初始化age=0,name=null
3)执行构造函数,将对象传进来的值赋值给成员属性
4)构造函数弹栈
5)对象创建完毕,将对象在堆内存中的地址传给p
5.默认构造函数:
关于在描述事物时,要不要在类中写构造函数,这时要根据描述事物的特点来确定,当描述的事物在创建对象时就要明确属性的值,这时就需要在定义类的时候书写带参数的构造函数。若创建对象时不需要明确具体的数据,这时可以不用书写构造函数,因为会有默认的无参的构造函数。
6.构造函数的细节
- 一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的
- 构造函数中可以有return语句,用于结束初始化动作
- 构造函数可以被private修饰,作用是:其他程序无法创建该类对象
7.构造函数与一般函数的区别 - 构造函数在对象创建时执行,且只执行一次
- 一般函数是在对象创建后,需要时才被对象调用,并可以被多次调用
问题:有了构造函数之后可以对对象的属性进行初始化,还需要对应的set和get方法吗?
需要,因为 构造函数在对象创建时执行,且只执行一次,而如果想在对象创建之后修改或者访问相应的属性值,只能通过set或get方法实现
this的用法以及原理图解
对于一般的函数,可以通过函数名来调用,而对于构造函数,必须使用this关键字来调用,调用格式为this(参数列表);
class Person{private int age;private String name;Person(){}Person(String nm){name=nm;}Person(int a,String nm){this(nm);age=a;}
}
class PersonDemo{public static void main(String[] args){Person p=new Person(22,"李四"); }
}
1.将main压栈,执行new Person(22,“李四”);
2.堆内存中分配一片地址为0x33的内存地址,紧接着给它的成员变量默认初始化(age=0 name=null)
3.因为传递的参数是两参的,所以两参的构造函数Person(int a,String name)进栈,这个构造函数中 有一个隐式的this,因为这个构造函数是给对象初始化的,因此,对象调用的构造函数中的this ,就指向了堆中的对象。
4.由于 Person(int a,String name)中使用了this(nm),所以Person(String name)进栈,并将“李四”赋值给nm,在Person(String name)中同样也有一个隐式的this ,this的也是0x33,然后执行name=nm,即“李四”赋值给成员的name。赋值结束后Person(String name)构造函数弹栈。
5.程序继续执行构造函数 Person(int a,String name)中的age=a,这时会将22赋值给成员属性age。赋值结束后 Person(int a,String name)弹栈
6.这时,Person 对象在对内存中创建完成,将0x33赋值给main()中的p引用变量。
注意:this代表对象,哪个对象调用了this所在的构造函数,this就指代的是那个对象,并且,调用其他构造函数的语句,即this();应放在构造函数的第一行,这是为了防止值发生覆盖。
当成员变量与局部变量重名
可以在成员变量前加this关键字来区分
更多推荐
Java基础知识之面向对象
发布评论