Java基础知识之面向对象

编程入门 行业动态 更新时间:2024-10-26 15:20:54

Java基础知识之<a href=https://www.elefans.com/category/jswz/34/1769334.html style=面向对象"/>

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基础知识之面向对象

本文发布于:2023-07-28 18:26:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1274347.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:面向对象   基础知识   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!