Java面向对象(萌新的学习心得及笔记)
JAVA面向对象
本人也是一个才学习Java不久的萌新,有很多的东西还需要我继续去学习去理解,由于目前接触也不是很多,所以如果有任何不足的地方,请大家谅解,也希望大家能继续补充或者提出见解。
什么是对象?
- 对象就是具有某些的特殊属性(成员变量)和行为方式(方法)的实体。
- 现实生活中的任何事物都可以理解为是 一个对象,无论是具体或抽象的事物,Java中就有了一种思想叫做“万物皆对象”。
- 属性是先人根据可描述实物抽象出来的。
行为是这个抽线实物可以具体实现的功能。
举例说明:
我是一个人,我可以跑步。
人(属性,Property) 人就是给我定义的属性。
跑步(具体行为,Behavior)跑步就是给我定义的一个行为。
什么是面向对象?
- 了解面向对象之前需要我们知道什么是面向过程,面向过程是以函数为基础,完成各种操作,强调过程;就是分析出解决问题所需要的步骤,然后用函数把这些步骤一个一个串联起来,一步一步实现,使用的时候一个一个依次调用。
- 面向对象是以对象为基础,完成各种操作,主要强调对象、结果。是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
- 面向对象的编程语言,是将功能封装进对象,强调具备某些功能的对象,其实面向对象的语言是基于面向过程的,因为即使是调用某个对象,被调用的对象的方法也是通过面向过程的方式编写的。但面向对象的编程思想更加符合人们的日常思维,将复杂的问题分解为不同领域的简单问题,一步一步拆开,更便于逻辑分析与分工合作。
面向对象学习内容
- 面向对象和面向过程
- 类和对象
- 对象的行为
- 对象数组
- 引用的对象
- 类的高级概念
- 继承
- 多态
- 抽象
- 接口
- OOAD面向对象分析设计
面向对象和面向过程
-
面向过程,是一种置顶向下,逐步求精的思想,需要关注每一个细节。
-
面向对象,通过面向职责进行问题域的划分,每个职责只关注该职责应该完成的任务,从而可以忽略一些细节。
-
如何理解面向过程和面向对象:面向对象是一种分析问题的方式,在开发中,先用面向对象思想进行职责和问题域的划分,然后,实现时,利用面向过程实现具体的操作。
-
什么是对象:
1、对象是存在的具体实体,具有明确定义的特征和行为。 2、万物皆对象,对象因我关注而产生。 3、面向对象:一种认识事物的方式,注重对事物整体的认知。
-
面向对象的术语:
1、OO:面向对象 2、OOP:面向对象编程 3、OOA:面向对象分析 4、OOD:面向对象设计
-
面向对象的特征:
1、继承 2、封装 3、多态
-
对象
this表示当前对象,在方法中使用this,表示访问该对象的属性或者方法。
类和对象
类是对象的抽象,对象是类的实例。
-
什么是类
1、类是具有相同属性和行为的一组对象的集合。 2、在软件系统中,我们用类来模拟现实生活中的实体。
-
this的用法
1、this表示当前对象,在方法中使用this.()表示当前访问的属性或方法。 2、在方法中,直接访问变量,优先访问局部变量,如果要访问属性,需要加上this.()
-
类与类的关系
1、has-a 一个类是另一个类的属性,是整体和部分的关系,是一种聚合/组合的关系。 2、use-a 一个类是另一个类方法的参数、返回类型、局部变量,是一种使用的关系。
-
属性
1、普通属性(1)创建对象时,每个属性都会做初始化,int---0,double---0.0,引用类型---null。 (2)不同的对象属性彼此独立,改变一个对象的属性值,不会影响别的对象。
2、静态属性(加static)
(1)唯一性,所有对象共享一个静态变量。 (2)静态变量一改变,影响所有对象 。 (3)静态变量在类加载时产生,产生在对象之前,并完成初始化,int---0 double---0.0 引用类型---null (4)静态变量可以用对象.和类名.的方式访问,所以,静态变量也称为类的变量
3、静态变量和成员变量的区别
(1)成员变量(属性)包含在对象之中,不同的对象成员变量彼此独立,改变一个对象的属性值不会影响别的对象。静态变量独立在对象之外,多个对象共享一个 静态变量,静态变量改变后会影响所有对象。 (2)静态变量在类加载时产生,产生在对象之前,长驻内存。 (3)静态变量可以通过对象和类去访问,但成员变量只能通过对象访问。
4、静态方法可以直接访问静态方法或静态变量,但是不能直接访问成员方法或成员变量。也不能用this。
对象的行为
在方法中,传递和返回对象,传递和返回的是对象的引用,且在Java中,只有值传递。
-
方法调用栈
当调用方法时,会使该方法位于调用栈的顶部,当方法执行完毕后,从调用栈顶部移除。 -
方法的重载
方法重载发生在同一个类中,两个方法的方法名相同,参数列表不同(类型、顺序、个数)。调用方法是根据实参来决定调用执行哪个重载方法。
1、编译时,方法名和方法参数的类型会参与编译。
2、重载和方法的返回类型、方法形参名无关的。
3、在调用方法时,如果一个实参同时匹配多个重载方法的形参,优先调用形参类型更小的重载方法。(double、long、short、int) -
方法的分类
1、成员方法
成员方法的调用必须通过对象.的方式调用。
2、静态方法(在方法定义时加上static)(1)静态方法在类加载时产生,加载在对象之前。所以,在静态方法中不能直接调用成员变量和成员方法,也不能用this。 (2)对静态方法的调用,可以通过对象.和类名.的方式调用。 (3)静态变量和静态方法的产生都不需要依赖于对象。所以,当null值调用静态变量和静态方法时,可以正常执行,不会抛出空指针异常。
3、构造方法
(1)构造方法的方法名和类名相同,没有返回类型,主要用于对象的创建。 (2)如果一个类中没有定义构造方法,那么编译器会自动分配一个无参构造方法。如果一个类定义了构造方法,那么编译器不会再分配无参构造方法。 (3)作用:为对象分配空间、初始化成员变量、返回对象的引用 (4)this();表示在一个构造方法中,调用当先类中的另一个构造方法。且this();只能放在第一句
对象数组
-
对象数组中的元素都是引用数据类型,创建后,初始值为null
-
只有让数组元素引用对象,才能对该元素进行属性和方法的调用,否则抛出空指针异常
-
复制数组可以使用System.arrayCopy()
-
产生帮助文档用javadoc命令,可以将文档注释写入API文档。
-
定义:
int[] x = new int[3];创建长度为3的数组,初始值为0 int[] x = {2,3,4};以初始化元素的个数,作为数组长度,只能在定义的时候使用,引用新数组,或传实参都不能用。 int[] x = new int[]{2,3,4,5};以初始化元素的个数,做为数组长度,在定义,引用新数组,传实参都可以使用。
-
可变长数组:
可变长数组的定义,只能用于方法的形参。例:public void test(int...array){} 调用:test(3,4,5,6,7); test(new int[]{2,3,4,5,6});
可变长数组参数,只能是方法的最后一个形参。
类的高级概念
-
访问修饰符:
(1)定义:类的每一个成员都有一个访问的权限。访问修饰符决定了类的成员是否能被别的类所访问。 (2)分类: *public*:公有的,本类和非本类都可以访问。 *protected*:受保护的,同包和不同包的子类可以访问。(用protected修饰构造方法,不表示该构造方法能被子类继承 ,而 是指不同包的子类可以调用构造方法,产生父类对象。) *默认*:本包可以访问。 *private*:私有的,本类可以访问。 (3)在一个包中有一个Student类,有一个Test测试类。在Test类中,是否能访问Student从Object中继承的protected修饰符的finalize方法
-
初始化块:
(1)静态初始化块:
1、静态初始化块,只在类加载时执行一次,不会因为对象的产生而执行。 2、一个类可以定义多个静态初始化块,类加载时按书写顺序执行。 在静态初始化块中,不能直接访问成员变量和成员方法。也不能用this
3、访问静态变量:
如果静态变量定义在静态初始化块之前,可以直接访问。 如果静态变量定义在静态初始化块之后,需要用类名.的方式访问。
4、语法:
class A{ static{ } }
(2)实例初始化块:
1、实例初始化块依赖于对象,没产生一个对象,就执行一次实例初始化块,在spuer()后执行。 2、访问成员变量: 如果成员变量定义在实例初始化块之前 ,可以直接访问。 如果成员变量定义在实例初始化块之后,需要用this.的方式访问。
-
内部类:
1、在一个类中,再建一个类,这个类称为内部类。
2、按存在位置分:
(1)成员内部类:语法: class Dog{ public class X{ public X(){ System.out.println("Dog中的X类,产生对象"); } } } Dog d = new Dog(); Dog.X a = d.new X();
1、成员内部类相当于外部类的属性,成员内部类对象的产生,需要依赖于外部类的 对象。
2、成员内部类也有独立的class文件,命名规则为:外部类名$内部类名.class
3、在内部类中,访问外部类对象:外部类类名.this
4、静态内部类:静态内部类是成员内部类的特例。静态内部类对象的产生不需要依赖于外部类对象。语法:class Dog{ public static class Y{ } } Dog.Y b = new Dog.Y();
(2)局部内部类
局部内部类是在类的方法内部定义的类。局部内部类只能在定义的方法内部中使用,一旦方法执行完毕,局部内部就会从内存中自动移除。语法:public static void main(String[] args){ class MyTest{ private int x; } MyTest m = new MyTest(); m.x = 8; } }
(3)匿名内部类
匿名内部类是局部内部类的特例,该类将类的定义和对象的创建结合在一起,只能为一个对象服务。语法:MM m1 = new MM() { @Override public void move() { } };
-
封装
-
按照信息隐藏的原则,将数据组织在一起的形式,称之为封装。
-
特点
1、信息的集合 2、信息的隐藏
-
私有属性+get/set方法和公有属性的区别
1、私有属性+get/set方法,由于私有属性无法直接访问,所以,可以通过删除get或set方法,将属性做成只读或只写属性,这一点公有属性做不到。 2、私有属性,通过 set方法进行属性值设置时,可以进行属性值合法性的验证,可以避免非法数据的录入,这一点公有属性做不到。 3、基于以上两点,属性如果没有特殊要求,一般都是私有的。
-
标准javaBean的规范
需要提供公有的无参构造方法
私有属性+get/set方法,进行访问和修改
实现序列化接口
继承
-
子类继承父类以后,可以重用父类中定义的属性和方法,采用extends关键字
-
子类可以在父类基础上,扩展自己特有的属性和方法
-
继承可以看作是类的抽象,将几个类中相同的属性和行为抽取到父类中,子类通过继承重用代码
-
继承是一种is-a的关系,用”是“来判断两个类之间是否有继承关系。比如:狗是动物,那么狗 继承于动物这个类。
-
继承使用原则
(1)观察要使用的类,讲共同的属性和方法迁移到父类,便于代码重用。 (2)对于不同的属性和方法在子类中重新定义。 (3)在设计阶段,现有子类,通过多个子类的抽象,定义父类。 (4)开发阶段,先定义父类,再通过子类继承父类,重用代码。
-
单根继承和多继承
(1)单根继承:优点:类继承的层次结构非常清晰,设计上更容易把握父类具有唯一共性。 缺点:设计丰富度会降低。
(2)多继承:
优点:可以同时具有多个父类的特征,让子类有更大的丰富度。 缺点:如果多个父类有相同的特征,那么子类继承哪一个?多继承会带来设计的混乱,继承结构也变得复杂。
(3)在java中,一个类只能有一个父类,一个类不能同时继承两个父类。
(4)所有的类都是直接或间接继承Object(java语言里的父类) -
继承原理
1、子类创建时,必须通过super()构造方法产生父类对象,如果子类构造方法没有写super(),那么编译器会自动加上super()。
2、子类对象创建时,会先产生父类对象,然后在父类对象基础上扩展子类特有的属性和方法,所以,在子类对象中,会包含一个完整的父类对象,因此子类对象可以重用父类定义的属性和方法。
3、如果父类中没有提供无参构造方法,那么,子类构造方法必须用super(实参)显示调用。
4、注意:super()和this()是互相冲突的。 super()必须写在子类构造方法的第一句。
-
重写
1、重写发生在父类和子类之间,子类方法名和父类相同,参数列表相同,返回类型相同,调用方法时,优先调用子类重写的方法,如果子类没有重写父类方法,那么就调用父类中继承的方法。
2、在子类方法上,可以加上@Override关键字。强行检测子类方法是否重写了父类方法,如果子类方法没有重写到父类方法,则编译错误。
3、重写的限制:(1)子类方法的访问修饰符要大于或等于父类方法 (2)子类方法抛出的异常要小于或等于父类方法
4、子类重写了父类的方法,父类的方法没有消失,可以用super().的方式访问父类中定义的属性或方法。
5、注意:private和static、final、构造方法不能被子类重写。
6、构造方法不能被子类继承,同样,构造方法也被能被子类重写。
(1)构造方法申明为protected,不表示该构造方法能被子类继承,指的是不同包的子类可以调用该构造方法产生父类对象。
(2)在别的类中产生对象,同时也不能有子类。如果一个类构造方法是private私有的,表示该类不能在彼得类中产生对象,同时也不能有子类。 -
final的用法
1、final修饰符,表示该类不能被继承。 2、final修饰方法,表示该方法不能被子类重写。 3、final修饰变量 ,表示变量的内容不能改变。 4、final修饰基本数据类型变量,表示变量的值不能改变。final修饰引用数据类型的变量,表示该变量不能引用别的对象,也不能重新赋值为null。
多态
-
允许使用父类变量引用子类对象,允许使用接口变量引用实现类对象。但反过来却不行。
-
多态调用时,父类变量引用子类对象,只能调用父类中定义的属性和方法,不能调用子类特有的属性和方法。
-
多态调用时,父类变量引用子类对象,调用方法时,优先调用子类重写的方法。这样,同一个父类变量在引用不同子类对象时,调用的方法实现可能也不一样,这就是相同的行为,不同的实现方式。
-
多态的应用:
(1)多态参数:如果使用父类变量为方法参数,意味着可以传递任何子类对象。如果使用接口变量做为方法参数,意味着可以传递任何一个实现类对象。
(2)多态集合:以父类类型创建集合,集合中的每个元素可以引用任何一个子类对象。 -
多态的分类:
(1)重载:在编译时就能确定调用哪个方法,称之为静态多态。
(2)重写:在运行时,根据变量引用的具体对象,才能确定调用哪个方法,称之为动态多态。(动态绑定) -
instanceof:判断一变量引用的对象是否匹配某种类型,如果该变量为null,匹配任何类型都为false。语法:
Animal a = new Bird(); //如果a的值为null空 都不匹配。 Animal a = null; //判断一个变量引用的对象是否匹配某种类型,只要是a的父类都能匹配。 System.out.println(a instanceof Bird); System.out.println(a instanceof Animal); System.out.println(a instanceof Object);
-
转型:
(1)向上转型:子类的变量可以直接赋值给父类变量(自动类型转换)。
(2)向下转型:父类的变量要赋值给子类的变量就需要强制类型转换,向下转型有类型转换异常(java.lang.ClassCastException)的风险,所以向下转型之前,最好用instanceof判断一下变量引用的对象是否匹配该类型。
抽象
-
抽象方法:
(1)如果一个方法只有定义没有内容,那么该方法就是抽象方法,用abstract修饰。 (2)抽象方法只能定义,不能有具体的内容,所以,抽象方法只能(;)分号,不能写{},只要一些{}无论是否有内容,都是具体方法。 (3)抽象方法需要被子类重写,所以,不能用private、static、final去修饰。 (4)由于构造方法不能被重写,所以,不能用abstract修饰 (5)抽象方法的意义:1、规范子类的代码 1、可以实现多态调用
-
抽象类:
(1)用abstract修饰的类,称为抽象类。 (2)抽象类不能直接实例化,抽象类变量只能引用子类对象。 (3)如果一个类继承一个抽象类,必须重写抽象类中定义的所有抽象方法,否则这个类只能是抽象类 (4)抽象类中可以定义抽象方法,也可以定义具体方法,同时抽象类当中也可以不定义抽象方法。 (5)如果一个类中有一个抽象方法,那么这个类只能是抽象类。
接口
-
接口可以看做是抽象类的特例,抽象类是属性和行为的抽象,两接口只是行为的抽象。
-
定义接口采用interface关键字,和抽象类一样,接口不能直接实例化。接口变量只能引用实现类对象。
-
一个类实现一个接口采用implements关键字,该类必须实现接口中定义的所有抽象方法,否则这个类就是抽象类。
-
接口中定义的方法,默认是public abstract,其中public abstract可以省去,不能用private 和protected修饰接口方法。
-
一个类只能继承一个父类,但是可以实现多个接口,中间可以逗号分开。
interface A{ public void a(); } interface B{ public void b(); } class Man{} class Hashband extends Man implements a,b{ @Override public void a(); @Override public void b(); }
-
接口可以继承接口,并可以多继承接口,一个类实现一个接口,除了实现该接口中定义的抽象方法以外,还要实现该接口父类接口中定义的抽象方法。
-
接口中定义的属性,都是public static final 。其中public static fanal可以省去。属性必须是常量且不能更改。
-
接口中可以定义具体方法(JDK1.8以后),但是只能是default方法和静态方法。
interface IWash{ public void wash(); public default void washCloth() { this.wash(); } public static void test() { } }
-
抽象类和接口的区别
(1)共同点:1、抽象类和接口都不能直接实例化,抽象类变量只能引用子类对象,接口变量只能引用实现类对象 2、一个类继承一个抽象类,必须重写抽象类中定义的所有抽象方法,否则,这个类只能是抽象类,一个类实现接口,必须实现接口中定义的所有抽象方法,否则,这个类也只能是抽象类。
(2)不同点:
1、抽象类中有构造方法,但是接口中没有构造方法。 2、一个类只能继承一个抽象类,但是可以实现多个接口。同时接口 也可以多继承接口。 3、属性区别:抽象类中,变量、常量、静态、非静态属性,都可以定义 ,访问修饰符也可以是任意修饰符。但是,接口中的属性,只能是公共的静态的常量。 4、方法区别:抽象类中,静态、非静态、抽象、实现方法,都可以定义,访问修饰符也可以是任意修饰符。接口中,只能定义公有抽象方法,default方法(JDK1.8)、抽象方法。
OOAD面向对象分析设计
类和类的关系
实现:一个类实现一个接口, is-like-a
泛化:一个类继承另一个类,is-a
依赖:一个类是另一个类方法的参数,返回类型,局部变量,use-a
聚合:一个类是另一个类的属性,是整体和部分的关系,has-a
组合:一个类是另一个类的不可分割的一部分,是一个强聚合,has-a
依赖、聚合、组合、合称为关联
总结
此次的博客仅仅是我个人对面向对象的理解和自己的随堂笔记,如果大家还有什么补充的知识点的话请在留言栏留言。每一条信息我都会看,并且在看到之后都会回复。码字不易,希望能给你们带来帮助。
本文地址:https://blog.csdn.net/m0_51912596/article/details/109268409
推荐阅读
-
Java学习笔记十八:Java面向对象的三大特性之封装
-
Java学习笔记二十五:Java面向对象的三大特性之多态
-
Java学习笔记二十一:Java面向对象的三大特性之继承
-
JAVA面向对象编程的思想及方法定义和调用
-
Java面向对象(萌新的学习心得及笔记)
-
Java开发笔记(七十八)面向对象的后门——反射
-
AJPFX:关于面向对象及java的一些机制的思考
-
Java学习笔记十八:Java面向对象的三大特性之封装
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定_php实例
-
photoshop学习心得 php学习笔记 php中面向对象三大特性之一[封装性]的应用