面向对象的概念
面向过程:面对的是过程、动作。动作为主做事情,一步一步执行,强调的是过程。c语言就是面向过程的,都是以函数为基础,对函数进行调用。
面向对象:面向的是对象,强调的是对象,对象即实体比如c++、Java、c#
面向对象的特点:
1、面向对象是常见的一种思考习惯,符合人们的思考习惯,力图使计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能的一致。
2、面向对象的出现,将复杂的事情简单化。类和对象是面向编程的核心概念。类是对一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该类事物的每个个体,因而也称为实例。
3、面向对象的出现,将之前过程中的执行者变成指挥者
类与对象
类和对象说明
类就是对象的描述,对象就是该类的实例,定义类就是定义类中的成员。类的成员:成员变量——属性,成员方法——行为。
代码实现
类的定义:
[<修饰符>] class <类名> {
[<属性>]
[<构造器>]
[<方法>]
}
属性定义&#xff1a;[<修饰符>] 类型 <属性名> [&#61;初值]
修饰符private&#xff1a;该属性只能由本类的方法访问&#xff0c;修饰符public &#xff1a;该属性可以被本类以外的方法访问&#xff0c;属性有时也称为&#xff1a;数据成员&#xff0c;成员变量。
方法定义&#xff1a;
<修饰符> <返回类型> <方法名> ([<参数表>]) {
[<语句>]
}
修饰符&#xff1a;public、private、protected、static等&#xff0c;返回类型&#xff1a;return语句传递返回值&#xff0c;没有返回值&#xff1a;void。
对象的创建和使用&#xff1a;使用new&#43;构造方法创建一个新对象&#xff0c;使用“对象名.对象成员”的方式访问对象成员&#xff08;包括属性和方法&#xff09;如果创建了一个类的多个对象&#xff0c;对于类中定义的属性&#xff0c;每个对象都拥有各自的一套副本&#xff0c;且互不干扰。对象创建后属性会被赋初值&#xff0c;基本数据类型&#xff1a;short----0 int----0 long----0L float---0.0F double----0.0 char----&#39;\u0000&#39; boolean----false&#xff0c;引用数据类型&#xff08;string&#xff09;----null
类的访问机制&#xff1a;在一个类中&#xff0c;类中的方法可以直接访问类中的成员变量。&#xff08;例外&#xff1a;static方法访问非static&#xff0c;编译不通过。&#xff09;不同类中的访问机制要先创建访问类的对象&#xff0c;再用对象访问类中定义的成员。
对象的内存体现
public class Test {public static void main(String[] args) {Car c1 &#61; new Car();Car c2 &#61; new Car();c2.num &#61; 5;c1.color &#61; "blue";c1.run();}
}
成员变量与局部变量
成员变量定义在类中&#xff0c;整个类中都可以使用。局部变量定义在方法代码块中&#xff0c;只在所属的区域有效。成员变量存在于堆内存的对象中&#xff0c;局部变量存在于栈内存的方法中。成员变量随着对象的创建而产生&#xff0c;随着对象的消失而消失。局部变量随着区域的执行而存在&#xff0c;随着区域的结束而释放。成员变量都有默认的初始化值&#xff0c;局部变量没有默认的初始化值。
参数传递代码
public class Test {public static void main(String[] args) {int x &#61; 4;chg(x);System.out.println(x);Demo d &#61; new Demo();System.out.println(d.x);chg(d);System.out.println(d.x);}//基本数据类型参数传递public static void chg(int a){a &#61; 100;}//引用数据类型参数传递public static void chg(Demo d){d.x &#61; 100;}
}
封装
使用者对类内部定义的属性&#xff08;对象的成员变量&#xff09;的直接操作会导致数据的错误、混乱或安全性问题。Java中通过将数据声明为私有的&#xff08;private&#xff09;提供公开的&#xff08;public&#xff09;方法&#xff1a;getXXX和setXXX实现对该属性的操作
构造方法
概述&#xff1a;当一个类的实例对象刚产生时&#xff0c;这个类的构造方法就会被自动调用&#xff0c;我么们可以在这个方法中加入要完成初始化工作的代码
特点&#xff1a;1、方法名与类名相同2、不用定义返回值类型3、没有具体的返回值
注意&#xff1a;1、不管有没有显示定义构造方法&#xff0c;创建对象都必须要通过构造方法初始化2、一个类中如果没有定义过构造方法&#xff0c;那么该类中会有一个默认的空参数构造方法3、如果在类中定义了指定的构造方法&#xff0c;那么类中的默认构造方法就没有了3、构造方法可以有多个&#xff0c;用于对不同的对象进行针对性的初始化4、多个构造方法在类中是以重载的形式来体现。
细节&#xff1a;一般方法不能直接调用构造方法&#xff0c;构造方法如果前面加了void就变成了一般方法&#xff0c;构造方法是有返回值的&#xff08;返回的是对对象的引用&#xff0c;或者对象的首地址&#xff09;
this关键字
this代表当前对象&#xff0c;当成员变量和局部变量重名&#xff0c;可以用关键字this来区分。this就是所在函数所属对象的引用&#xff0c;简单说哪个对象调用了this所在的函数&#xff0c;this就代表哪个对象&#xff0c;this也可以用于在构造函数中调用其他构造函数。但只能定义在构造函数的第一行&#xff0c;因为初始化动作要先执行。
static关键字
通过new关键字才会产生出对象&#xff0c;这时系统才会分配内存空间给对象&#xff0c;其方法才可以供外部调用&#xff0c;如果希望无论是否产生了对象或无论产生了多少对象的情况下&#xff0c;某些特定的数据在内存空间里只有一份就可以使用static关键字。
特点·&#xff1a;1、static是一个修饰符&#xff0c;用于修饰属性和方法2、static修饰的属性被所有对象共享3、static优先于对象存在&#xff0c;因为static的成员随着类的加载就已经存在了。4、static修饰的成员多了一种调用方式&#xff0c;就可以直接被类名所调用&#xff0c;类名.静态成员5、static修饰的数据是共享数据&#xff0c;对象中的存储的是特有数据6、static修饰的属性和方法属于类不属于对象。
成员变量和静态变量的区别&#xff1a;1、两个变量的生命周期不同。成员变量随着对象的创建而存在&#xff0c;随着对象的被收回而释放&#xff0c;静态变量随着类的加载而存在&#xff0c;随着类的消失而消失。2、调用方式不同。成员变量只能被对象调用&#xff0c;静态变量可以被对象调用&#xff0c;还可以被类名调用。3、别名不同。成员变量也称为实例变量&#xff0c;静态变量成为类变量。4、数据存储位置不同。成员变量数据存储在堆内存的对象中&#xff0c;所以也叫对象的特有数据&#xff0c;静态变量数据存储在方法区&#xff08;共享数据区&#xff09;的静态区&#xff0c;所以也叫对象的共享数据。
注意&#xff1a;静态方法只能访问静态成员。&#xff08;非静态即可以访问静态又可以访问非静态&#xff09;静态方法中不可以使用this或者super关键字&#xff0c;主函数是静态的。
继承
子类继承了父类&#xff0c;就继承了父类的方法和属性。在子类中&#xff0c;可以使用父类中定义的方法和属性&#xff0c;也可以创建新的数据和方法&#xff0c;因而&#xff0c;子类通常比父类的功能更多。在Java中&#xff0c;继承的关键字用的是"extends"&#xff0c;即子类是父类的扩展。这样做的好处是提高代码复用性&#xff0c;使类之间产生关系&#xff0c;为多态提供可能。
子父类中成员特点&#xff1a;成员变量。当本类的成员和局部变量同名用this区分,当子父类中的成员变量同名用super区分父类&#xff0c;this和super的用法很相似。this代表一个类对象的引用。super代表一个父类空间。当成员变量是私有的时候&#xff0c;子类中不能直接访问父类的私有成员。成员方法。当子父类中出现成员函数一模一样的情况&#xff0c;会运行子类的函数。这种现象成为覆盖操作也称为重写&#xff08;override&#xff09;函数的另一个特性是重载&#xff08;overload&#xff09;&#xff0c;重写要注意子类方法在覆盖父类方法时&#xff0c;子类权限必须要大于等于父类的权限&#xff0c;另外静态只能覆盖静态或被静态覆盖。
注意&#xff1a;Java支持单继承&#xff0c;不直接支持多继承。当类与类之间存在着所属关系的时候就定义继承&#xff0c;写继承不只是为了复用性&#xff0c;而是要有关系才去继承。
final关键字
在Java中声明类、属性和方法时&#xff0c;可使用关键字final来修饰&#xff0c;表示“最终”&#xff0c;final关键字是修饰符。final修饰的类不能被继承。提高安全性&#xff0c;提高程序的可读性。final修饰的方法不能被子类重写。final修饰的属性为常量&#xff0c;一旦初始化后不可再被赋值&#xff0c;习惯上常量用大写字符表示
多态
概念&#xff1a;多态性可以理解为一个事物的多种表型形态&#xff0c;方法的重载、重写就是多态的一种体现。
子类对象的多态性&#xff1a;在Java中子类的对象可以替代父类的对象使用&#xff0c;使用的前提是要继承、实现&#xff08;接口&#xff09;要有子类对父类方法的重写&#xff0c;使子类具有不同的方法实现。将父类类型的引用指向子类的对象&#xff1a;向上转型就是将子类对象转为父类对象&#xff0c;此处父类对象可以是接口&#xff0c;“&#61;”左边是父类的引用&#xff0c;右边是子类的对象。虚拟方法调用&#xff1a;通过父类的引用指向子类的对象实体&#xff0c;当调用方法时实际执行的是子类重写父类的方法。父类引用的对象转化为子类类型称为向下转型&#xff0c;使用强转&#39;()&#39;&#xff0c;为了避免ClassCastException&#xff0c;最好在向下转型前进行判断&#xff1a;instanceof。格式&#xff1a;对象a instanceof 类A。判断对象A是否是类A的一个实例&#xff0c;是的话返回true&#xff1b;否则返回false。若a是A类的实例&#xff0c;那么A也一定是A类的父类的实例。
注意&#xff1a;对象的多态性不适用于子类对象的新方法。子类对象的多态性并不适用于属性。子类对象的多态性并不适用于静态方法。
使用多态可以增强程序的可扩展性及可维护性&#xff0c;使代码更简洁。不但能减少编码的工作量&#xff0c;也能大大提高程序的可维护性及可扩展性。
单例模式
单例模式就是一个类的对象的实例只有一个&#xff0c;如果我们要让类在一个虚拟机中只能产生一个对象&#xff0c;我们首先必须将类的构造方法的访问权限设置为private&#xff0c;不能用new操作符在类的外部直接产生类的对象&#xff0c;调用该类的某个静态方法以返回类内部创建的对象&#xff0c;静态方法只能访问类中的静态成员变量&#xff0c;所以&#xff0c;指向类内部产生的该类对象的变量也必须定义成静态的。单例模式分为饿汉式与懒汉式两种前者是线程安全的后者是非线程安全的。
抽象类和接口
抽象类
抽象类就是一个不具体的类&#xff0c;用abstract关键字来修饰一个类时&#xff0c;这个类叫抽象类。抽象类可以被继承不能被实例化&#xff0c;与fianl类恰好相反。用abstract来修饰一个方法时该方法叫抽象方法&#xff0c;只有方法的声明&#xff0c;没有方法的实现&#xff0c;以分号结束&#xff0c;例如&#xff1a;abstract int abstractMethod(int a);注意抽象方法必须为public或者protected&#xff08;因为如果为private则不能被子类继承&#xff0c;子类便无法实现该方法&#xff09;&#xff0c;缺省情况下默认为public&#xff0c;抽象方法只保留方法的功能&#xff0c;而具体的执行交给继承抽象类的子类&#xff0c;有子类重写此方法。若子类继承抽象类&#xff0c;并重写了所有的抽象方法&#xff0c;则此类是一个实体类&#xff0c;即可以实例化。若子类继承抽象类没有重写所有的抽象方法&#xff0c;意味着此类中仍有抽象方法&#xff0c;则此类必须声明为抽象的。注意&#xff1a;抽象类有构造器&#xff0c;抽象方法所在的类一定是抽象类&#xff0c;抽象类中可以没有抽象方法&#xff0c;不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。抽象类和一般类都是用来描述事物的&#xff0c;都在内部定义了成员但是一般类有足够的信息描述事物&#xff0c;抽象类描述事物的信息可能有不足。一般类可以被实例化&#xff0c;抽象类不可以被实例化。一般类中不能定义抽象方法&#xff0c;只能定义非抽象方法。抽象类中可以定义抽象方法同时也可以定义非抽象方法。
接口
接口是抽象方法和常量值的定义的集合&#xff0c;从本质上讲接口是一种特殊的抽象类&#xff0c;在这种抽象类中只包含常量和方法的定义&#xff0c;而没有变量和方法的实现&#xff0c;Java中不支持多继承但可以实现多个接口&#xff0c;定义类使用class&#xff0c;定义接口使用关键是interface&#xff0c;例如&#xff1a;interface InterfaceA{}&#xff0c;继承类使用关键字extends&#xff0c;实现接口使用关键字implements&#xff0c;例如&#xff1a;class SubClass implements InterfaceA{}&#xff0c;类与类之间是继承关系&#xff0c;类与接口之间是实现关系&#xff0c;使用关键字implements实现接口&#xff0c;然后重写接口中定义的抽象方法。接口可以看成是一个特殊的抽象类&#xff0c;是常量与方法的一个集合&#xff0c;不能包含变量、一般的方法。接口中的所有成员变量都默认是由public static final修饰的&#xff0c;接口中的所有方法都默认是由public abstract修饰的因此接口中的成员都是公共的权限&#xff0c;接口是没有构造器的&#xff0c;接口不可以实例化。接口定义的就是一种功能&#xff0c;此功能可以被类所实现&#xff0c;实现接口的类若没有重写所有的抽象方法则此类仍是一个抽象类&#xff0c;因此必须重写所有的抽象方法方可实例化。一个类在继承另一个类的同时还可以实现多个接口&#xff0c;与继承关系类似&#xff0c;接口与实现类之间存在多态性。
接口VS抽象类&#xff1a;相同点是接口和抽象类都不能被实例化&#xff0c;只能被其他类实现和继承。接口和抽象类都可以包含抽象方法&#xff0c;实现接口和抽象类的类都必须实现这些抽象方法否则实现的类就是抽象类。不同点&#xff1a;抽象类和接口定义不同&#xff0c;抽象类abstract接口interface。接口里只能包含抽象方法&#xff0c;不包含已经实现的方法&#xff0c;抽象类则可以完全包含普通方法。接口里不能定义静态方法&#xff0c;抽象类可以定义静态方法。接口里只能定义静态常量属性&#xff0c;不能定义普通属性&#xff0c;抽象类里既可以定义普通属性也可以定义静态常量。接口不包含构造函数&#xff0c;抽象类可以包含构造函数&#xff0c;抽象类里的构造函数并不是用于创建对象&#xff0c;而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。接口不包含初始化快&#xff0c;但抽象类可以包含初始化块。一个类最多只能有一个直接父类&#xff0c;包含抽象类&#xff1b;但一个类可以直接实现多个接口&#xff0c;通过实现多个接口可以弥补java的单继承不足