JAVA 纯面向对象语言, 有平台无关性,一次编译到处运行,编辑器会把java 代码变成中间代码,然后在JVM上解释执行。 拥有很多内置的类库, 提供了对Web 应用开发的支持,具有较好的安全和健壮性。
JAVA 和C++的异同 都是面向对象语言使用了面向对象的思想(封装,继承,多态),面向对象的特性(继承和组合)
面向对象有以下特点:
(1)面向对象是一种常见的思想,比较符合人们的思考习惯;
(2)面向对象可以将复杂的业务逻辑简单化,增强代码复用性;
(3)面向对象具有抽象、封装、继承、多态等特性。
面向对象的编程语言主要有:C++、Java、C#等。
类和对象的关系
类:
对某类事物的普遍一致性特征、功能的抽象、描述和封装,是构造对象的模版或蓝图,用 Java 编写的代码都会在某些类的内部。类之间主要有:依赖、聚合、继承等关系。
对象:
使用 new 关键字或反射技术创建的某个类的实例。同一个类的所有对象,都具有相似的数据(比如人的年龄、性别)和行为(比如人的吃饭、睡觉),但是每个对象都保存着自己独特的状态,对象状态会随着程序的运行而发生改变,需要注意状态的变化必须通过调用方法来改变,这就是封装的基本原则。
封装思想
核心思想就是“隐藏细节”、“数据安全”:将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。
使用 private
修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public
的 set
和 get
方法按照开发者的意愿
public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
protected 修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
default 修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。
继承和类实例化过程
* (2)Java 的继承机制是单继承,即一个类只能有一个直接父类。
* (3)如果子类和父类有同名成员变量和方法,子类可以使用 super 关键字调用父类的成员变量和方法,上述使用方式前提是成员在子类可见。
* (4)在调用子类构造方法时,会隐式的调用父类的构造方法 super()。如果父类没有无参构造方法,为了避免编译错误,需要在子类构造方法中显式的调用父类的含参构造方法。
* (6)当子类需要扩展父类的某个方法时,可以覆盖父类方法,但是子类方法访问权限必须大于或等于父类权限。
类的实例化过程
(1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;
(2)堆内存分配空间;
(3)执行父类、子类静态代码块;
(4)对象属性进行默认初始化;
(5)调用构造方法;
(6)在构造方法中,先调用父类构造方法初始化父类数据;
(7)初始化父类数据后,显示初始化,执行子类的构造代码块;
(8)再进行子类构造方法的特定初始化;
(9)初始化完毕后,将地址赋值给引用
多态、反射和组件解耦
多态指允许不同类的对象对同一“消息”做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。可以用于消除类型之间的耦合关系,Spring 的核心就是多态和面向接口编程。
(1)Java 中可以使用父类、接口变量引用子类、实现类对象;
(2)在这个过程中,会对子类、实现类对象做自动类型提升,其特有功能就无法访问了,如果需要使用,可以做强制类型转换。
1 )JAVA 为解释性语言,经过java 编辑器编译成字节码,然后给JVM 执行,C/C++ 为编译型语言,直接生成二进制代码,所以JAVA 执行速度慢,但是可以跨平台执行。
2)JAVA 纯面向对象,包扩所有的函数变量必须在类中实现,除了基本数据类型。JAVA不存在全局变量和全局变量函数。 C++ 兼有面向对象和面向过程的特点。
3)JAVA 中没有指针的概念
4)JAVA 不支持多重继承,但是可以实现多个接口。
5)C++需要开发人员对于管理内存分配,JAVA提供了垃圾回收器实现自动回收,JAVA没有析构函数,但是提供了finalize()方法。释放无用对象内存。
6)C++ 支持运算符重载,但是JAVA 不支持。 C++支持预处理,JAVA 提供了import 机制。JAVA 不支持结构和联合,所有的内容都封装在类里面。
7)JAVA 具有平台无关性。每种数据类型都分配了固定的长度。C++不同平台分配不同的字节数。
为什么使用 public static void main(String[] args)
程序入口: JVM 运行时回首先找main 方法, 这个类被加载后就可以使用。不需要实例化,可以直接通过类型访问,类名.main() 来访问。 args 为开发人员在命令行下提供了程序交互手段。
1 public static void 没有先后顺序
2 main() 可以定义为 final 也可以用synchronized 修饰 但是返回值必须是void 并且有static 和public 修饰。 不能用abstract(抽象类不能有方法主体)
main 方法前输出Hello world
静态块
java 实例化顺序
JAVA 作用域
public > protect > default >private
一个 JAVA 文件中可以定义多个类,但是只有一个类可以被public 修饰。并且这个类的名字必须与文件名相同,如果没有public 类,那就无所谓。
构造函数
1) 与类名相同。不能有返回值
2)可以有多个构造函数,没有的时候,编译成字节码的时候会提供无参构造函数。
3) 构造函数伴随着new 一起使用,由系统调用,实例化的时候自动执行,只调用一次。
4)构造函数不能被继承,但是可以重载。
5) 子类可以super 调用父类的构造函数,父类中没有无参构造函数的时候,子类必须显示调用父类中的构造函数。如果父类提供了无参构造函数的时候,构造起会自动调用父类的构造函数。
JAVA 中有些接口没有方法
因为没有多重继承,所以java 引入了接口,接口是抽象方法定义的集合。接口中成员的修饰符都是public 接口中的常量默认使用 public static final 修饰。
有些接口内部没有任何方法,说明不需要重写任何方法 ,仅仅作为标示接口,用来表面实现他的类属于一个特定的类型。
JAVA 中的clone 方法有什么用
1)复制函数返回的是一个新的对象而不是一个引用,实现clone 的类需要继承cloneable 接口,标示接口。
2)类中重写clone()方法。
3)clone方法中调用super.clone 无论clone 类的继承结构是什么,他都会直接或者间接的调用java.lang.Object 类的clone 方法。
C++中会存在浅复制和深复制,JAVA 也有这样的问题,类中包含一些对象的时候,就需要使用深复制,在对对象调用clone 方法完成复制后,对于非基本类型的属性调用clone 方法完成深复制。
Object 中的clone 被声明为protected的, 保证了类里面才能克隆 对象。
浅复制只考虑了复制的对象,而不会复制它引用的对象。深复制考虑被复制对象所有变量都含有与愿对象相同的的值。
什么是反射机制
放射机制可以是现在运行时对类进行装载。运行时动态的创建类的对象。
获取class 类:
1) class.forName(“类路径”)
2)类名.class
3)实例.class
4.1.12