面向对象的这些核心技术,你掌握后包你面试无忧

前程有光 2020-11-07 21:40:34
面向对象 对象 核心技术 核心 面向


面向对象简介

面向对象是相对于面向过程来说的,面向过程是一种以“过程”为中心的编程思想,分析出解决问题所需的步骤,然后用函数把这些步骤一步步的实现,使用的时候一个个依次调用就好。而面向对象,是一种以“对象”为中心的编程思想,把问题看成一个个对象,通过对象的属性和行为,将问题解决的。面向过程强调的是模块化,而面向对象强调的是把事物对象化。

复杂来说面向对象是以“对象”为基本单元构建系统,对象是把数据和数据操作方法放在一起,作为一个相互依存的整体。把同类的对象抽象出其共性,形成类。所以说类是对象的抽象,对象是类具体化的体现(类是大范围的,一个类可以有多个对象),类中的大多数数据只能通过本类的方法实现,类包含说明和实现,说明部分被外界所看到,通过简单的外部接口与外界进行联系;实现部分不被外界所看到,在内部通过不同方法的构建,实现不同的功能。对象与对象之间通过消息进行沟通,程序流程由用户在使用中决定。

面向对象用以解决越来越复杂的需求,提高了软件的重用性,灵活性和拓展性。

static关键字

static表示“静态”的意思,可以用来修饰成员变量和成员方法。 static的主要作用在于创建独立于具体对象的域变量或者方法 简单理解: 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问, 并且不会因为对象的多次创建而在内存中建立多份数据。

  1. 静态成员 在类加载时加载并初始化。
  2. 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )
  3. 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
    静态方法调用的三种方式:
    1.new xx().静态(); //使用对象调用,不推荐
    2.xx.静态(); //类名调用,正规调用方法,推荐
    3.静态(); //本类的静态方法在本类调用,直接调用
    注意事项:
    在同包不同类调用的时候,可以直接 类名.方法() 调用,无需创建对象。
    在不同包调用的时候,需要引包再调用。

代码示例:

package com.vedio.highobject;
public class Pool {
public static int water=0;//静态变量
public static void outlet() {//放水
if(water>=2) {
water=water-2;
}else {
water=0;
}
}
public static void inlet() {//进水
water=water+3;
}
public static void main(String[] args) {
System.out.println("水池的水量:"+water);
System.out.println("水池注水两次。");
Pool.inlet();
Pool.inlet();
System.out.println("水池的水量:"+water);
System.out.println("水池放水一次。");
Pool.outlet();
System.out.println("水池的水量:"+water);
}
}

注意:在类中调用静态方法和静态方法时,需要使用类名.变量名或类名.方法名调用,在本类中调用静态方法和静态方法时,可以不加类名。

instanceof关键字

只有存在继承关系,才能使用instanceof关键字,否则会报错

代码示例:

//只有存在继承关系,才能使用instanceof关键字,否则会报错
public class Computer {//电脑类
public static void main(String[] args) {
Pad ipad=new Pad();
LenovoPad lenovoPad=new LenovoPad();
System.out.println("Pad是否继承自电脑?"+(ipad instanceof Computer));
System.out.println("LenovoPad是否继承自Pad?"+(lenovoPad instanceof Pad));
System.out.println("Pad是否继承自LenovoPad?"+(ipad instanceof LenovoPad));
// System.out.println("Pad是否继承自人类?"+(ipad instanceof Person));//ipad与Person这个类没有任何的继承关系
}
}
class Pad extends Computer{//平板电脑
}
class LenovoPad extends Pad{//联想平板电脑
}
public class Person {
public Person(String name){
System.out.println("您好,我叫"+name);
}
}

ipad和Person两个类没有任何继承关系,所以使用instanceof时,会直接报错。

euqals()方法

查看equals()源码,如下

public boolean equals(Object obj) {
return (this == obj);
}

所以在object类中equals方法只能用来比较地址是否一样,与==作用一样。但当我们可以自己重写equals方法,使之满足我们的需求。

比如我们定义一个Person类,只有id和name都一样时,才确定他们是同一个人。代码示例:

package com.vedio.highobject;
public class Person {
String name;
String id;
public boolean equals(Person p) {
return this.name.equals(p.name)&&this.id.equals(p.id);
}
}
package com.vedio.highobject;
public class Demo1 {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person();
Person p3=new Person();
p1.name="小明";
p1.id="123";
p2.name="小红";
p2.id="123";
p3.name="小明";
p3.id="123";
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p2.equals(p3));
}
}

可以观察到,只有id和name完全一样是,才为true。通过重写equals方法,满足了我们的需求。

equals与==的区别

String可以使用equals比较地址是因为它重写了equals方法
查看String对equals方法的重写源码,如下:

 public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

equals是判断两个变量或者实例指向同一个内存空间的值是不是相同,而==是判断两个变量或者实例是不是指向同一个内存空间,
举个通俗的例子来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个
代码示例:

package com.vedio.highobject;
public class Demo2 {
public static void main(String[] args) {
String s1=new String("123");
String s2=new String("123");
System.out.println(s1.equals(s2));
System.out.println(s1==s2);
String s3="123";
String s4="123";
System.out.println(s3.equals(s4));
System.out.println(s3.equals(s1));
}
}

toString()方法

package com.object.high;
//所有类的父类 --Object类
//在Java中,所有的类都直接或间接继承了java.lang.Object类
//由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法
public class Hello {
//重写toString()方法
public String toString(){
return "Say \""+getClass().getName()+"\" to Java";//getClass().getName()获取类的名称
}
public static void main(String[] args) {
System.out.println(new Hello());//当打印某个类对象时,将自动调用重写的toString()方法
}
}

最后

感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

版权声明
本文为[前程有光]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000037759352

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云