刚开始学习Java的时候,一个人跌跌撞撞摸索着往前走,很多东西理解的也懵懵懂懂,后来实践的多了,才慢慢清楚;许多东西虽然很基础但是却很重要,是需要反复思考和加深理解的。头条号“一张图学Java”,分享一些归纳总结后的技术干货,一张图能搞定的事,绝对不长篇大论。
大家都知道,Java面向对象是Java的一个核心,也是初学者的一个难点,所以我们从这里开始,Let’s go !
Java面向对象
面向对象(Oriented Object)
是相对于面向过程而言的,过程其实就是函数,对象是将函数和属性进行了封装。
(1)将复杂的事情简单化。
(2)面向对象将以前的过程中的执行者,变成了指挥者。
(3)面向对象思想是符合人们思考习惯的一种思想。
面向对象和面向过程区别
- 面向过程:事物比较简单,可以用线性的思维去解决。
- 面向对象:事物比较复杂,使用简单的线性思维无法解决。
- 共同点:都是解决实际问题的一种思维方式。解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系,方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理。
对象
接收消息的实体,一切皆为对象,对象都有属性和行为,对象都属于某个类,每个对象都是独一无二的。
类
创建对象的蓝图和模板
类的属性:数据抽象
类的方法:行为抽象
构造器(构造方法)
接口
抽象方法的集合
(1)作用:
- 能力,实现一个接口就代表具备了某方面的能力。
- 约定,一个类实现了接口就必须实现接口中的所有抽象方法否则要被声明为抽象类。
- 角色,一个类可以实现多个接口来扮演多种角色
(2)接口之间可以继承而且支持多重继承
(3)从Java 8开始接口中的方法允许有默认实现
(4)常见的接口用法
- 单方法接口(函数式接口):Lambda表达式、@FunctionalInterface
- 标识性接口
- 普通接口
- 常量接口(接口最不正确的用法)
Java面向对象语言的三大特点
- 继承:从已有类创建新类的过程。
父类(超类/基类):提供继承信息的类
子类(派生类):得到继承信息的类
- 封装:隐藏一切可隐藏的实现细节提供简单的编程接口。私有属性,公有方法。好处:将变化隔离;便于使用;提高重用性,安全性。
- 多态:
方法重写:子类对父类的方法给出自己的实现版本。
对象造型:用父类型的引用去引用子类对象。
成员
定义在类中。成员有两种:
(1)成员变量:其实对应的就是事物的属性。
(2)成员函数:其实对应的就是事物的行为。
局部变量和成员变量的区别
(1)成员变量直接定义在类中。
局部变量定义在方法中,参数上,语句中。
(2)成员变量在这个类中有效。
局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。
(3)成员变量定义在堆内存中,随着对象的产生而存在,消失而消失。
局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
构造函数
用于给对象进行初始化 ,函数中的一种。构造函数是在对象创建时被调用的,而且 初始化动作只执行一次 。
特点:该函数的名称和所在类的名称相同。不需要指定返回值类型。该函数没有具体的返回值。
注意:在定义一个类的时候,如果没有定义一个构造函数,系统会自动生成一个无参构造函数,以便于该类对象的创建和初始化。如果类中自定了构造函数,那么默认的构造函数没有了。如果一个类中有多个构造函数,这些构造函数是以重载体现的。
构造代码块和构造函数的区别
构造代码块:是给所有的对象进行初始化 ,只要对象一建立就会调用这个代码块。
构造函数:是给与之对应的对象进行初始化。
创建一个对象内存中执行过程
Person p = new Person();
(1)将硬盘中指定位置的Person.class文件加载进内存。
(2)执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量P。
(3)new。在堆内存中开辟一个实体空间,分配了一个内存首地址值。
(4)在该实体空间中进行属性的空间分配,并进行了默认初始化。
(5)对空间中的属性进行显示初始化。
(6)进行实体的构造代码块初始化。
(7)调用该实体对应的构造函数,进行构造函数初始化。
(8)将首地址赋值给p,p变量就引用了该实体。(指向了该对象)
this关键字
代表对象。就是所在函数所属对象的引用。哪个对象调用了this所在的函数,this就代表哪个对象。
this是方法(除静态方法外)中存在的隐式参数,所以在方法中使用this。
普通方法中,this总是指向调用该方法的对象。this.xx; (调用的是成员属性和成员方法)
构造方法中,this总是指向正要初始化的对象。this(...); (调用本类对应参数的构造函数)
注意:
(1)this调用构造函数,必须定义在构造函数的第一行。否则编译失败。
(2)this不能用于static修饰的方法。
static关键字
关键字,是一个修饰符,用于修饰成员(成员变量和成员函数)
在类中,用static声明的成员变量为静态变量,或者叫做:类属性,类变量, 从属于类,给对象分配的内存里没有。
它为类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显示初始化,
对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享。
可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”。
static变量置于方法区中。
用static声明的方法为静态方法。
类名.方法名的方式调用。
在调用该方法时,不会将对象的引用传递给它,所以在static方法中,不可访问非static的成员。
在静态方法中,不能是用this和supper关键字。
成员变量和静态变量的区别
(1)成员变量所属与对象,所以也称为实例变量。
静态变量所属于类,所以也称为类变量。
(2)成员变量存在于堆内存中。
静态变量存在于方法区中。
(3)成员变量随着对象的创建而存在,随着对象被回收而消失。
静态变量随着类的加载而存在,随着类的消失而消失。
(4)成员变量只能被对象所调用。
静态变量可以被对象调用,也可以被类名调用。
所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
静态代码块
就是一个有静态关键字标示的一个代码块区域。定义在类中。
作用:可以完成类的初始化 。静态代码块随着类的加载而执行,而且只执行一次。如果和主函数在同一个类中,优先于主函数执行。
静态代码块、构造代码块、构造函数同时存在时的执行顺序
静态代码块-->构造代码块-->构造函数。
继承
(1)类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
(2)提高代码的复用性。
(3)extends的意思是“扩展”。子类是父类的扩展。
(4)子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法)。
(5)Java中只有单继承,没有多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
(6)Java中的多继承,可以通过接口来实现。
(7)java.lang.Object是所有类的超类。
重载(overload)
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。
同一个类,同一个方法名。
不同:参数列表不同(类型,个数,顺序不同)
只有返回值不同,不构成方法的重载。
方法重写(override)
在子类中可以根据需要对从父类中继承来的方法进行重写。
重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。