JavaSE编程基础之面向对象
一.类和对象的概念
1. 对象主要指现实生活中客观存在的实体,在Java语言中对象体现为内存空间中的一块存储区域。
2. 类简单来就是“分类”,是对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中体现为一种引用数据类型,里面包含了描述特征/属性的成员变量以及描述行为的成员方法。
3. 类是用于构建对象的模板,对象的数据结构由定义它的类来决定。
二.可变长参数
1. 语法: 返回值类型 方法名(参数的类型... 参数名) 例如: void Test(String... tes){}
2. 方法参数部分指定类型的参数个数是可以改变的,也就是0~n个 。
3. 一个方法的形参列表中最多只能声明一个可变长形参,并且需要放到参数列表的末尾。
三.参数传递的注意事项
1.基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间。
2.引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间。
3.当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向(重新new了空间)后再改变指定的内容,则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同的内存空间。
四.内存结构之栈区
1.栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次方法的调用。
2.JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。
3.当某一个方法调用完成后,其对应的栈帧将被清除。
五.构造方法
1. 构造方法名与类名完全相同并且没有返回值类型,连void都不许有。
2. 当一个类中没有定义任何构造方法时,编译器会自动添加一个无参空构造构造方法,叫做默认/缺省构造方法,如:Person(){}
3. 若类中出现了构造方法,则编译器不再提供任何形式的构造方法。
4.构造方法的作用: 使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作。
六.方法重载和重写的区别
1.重载:若方法名称相同,参数列表不同,这样的方法之间构成重载关系 (Overload)。
方法重载的主要形式体现在:参数的个数不同、参数的类型不同、参数的顺序不同,与返回值类型和形参变量名无关,但建议返回值类型最好相同。(重载是发生在同一个类中)
2.重写: 从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写一个和父类一样的方法来覆盖从父类中继承下来的版本,该方式就叫做方法的重写(Override)。(重写是发生在不同的类中)
方法重写的原则: 要求方法名相同、参数列表相同以及返回值类型相同,从Java5开始允许 返回子类类型;方法的访问权限不能变小,可以相同或者变大;方法不能抛出更大的异常(异常机制)。
七.this关键字的使用
基本概念: 若在构造方法中出现了this关键字,则代表当前正在构造的对象。若在成员方法中出现了this关键字,则代表当前正在调用的对象。this关键字本质上就是当前类类型的引用变量。
使用方式: 当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量[就近原则](注:如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀)。
this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值。
(注意:this()不能在普通方法中使用,只能写在构造方法中。在构造方法中使用时,必须是第一条语句。)
八.final关键字
final本意为"最终的、不可改变的",可以修饰类、成员方法以及成员变量。
使用方式:
①final关键字修饰类体现在该类不能被继承。 - 主要用于防止滥用继承,如:java.lang.String类等。
②final关键字修饰成员方法体现在该方法不能被重写但可以被继承。 - 主要用于防止不经意间造成重写,如:java.text.Dateformat类中format方法等。
③final关键字修饰成员变量体现在该变量必须初始化且不能改变。 - 主要用于防止不经意间造成改变,如:java.lang.Thread类中MAX_PRIORITY等。
九.构造块和静态代码块执行顺序
①先执行父类的静态代码块,再执行子类的静态代码块。
②执行父类的构造块,执行父类的构造方法体。
③执行子类的构造块,执行子类的构造方法体。
十.static关键字
1.概念:使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层 级提升 为类层级,也就是整个类只有一份并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关。static关键字修饰的成员可以使用引用.的方式访问,但推荐类名.的方式。
2.静态成员和非静态成员的区别
在非静态成员方法中既能访问非静态的成员又能访问静态的成员。(静态成员被所有对象共享,成员=成员变量+成员方法)
在静态成员方法中只能访问静态成员不能访问非静态成员。(因为此时可能还没有创建对象,成员=成员变量+成员方法)
3.静态类和非静态类的区别
静态类的特点:全局唯一,任何一次的修改都是全局性的影响;只加载一次,优先于非静态;使用方式上不依赖于实例对象;生命周期属于类级别,从JVM加载开始到JVM加载结束。
区别如下:
①内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的的引用。
②非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。
③一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。
(注:在java中静态类只能定义为内部类,定义为外部类会编译出错)
上代码更形象解释如下:
|
十一.访问控制符
(注:Y[可以访问],N[不可以访问])
修饰符 |
本类 |
同一包内 |
子孙类(同一包) |
子孙类(不同包) |
其他包 |
public |
Y |
Y |
Y |
Y |
Y |
protected |
Y |
Y |
Y |
在子类中,子类实例可以访问其从基类继承来的protected修饰的方法,而不能访问基类实例的protected |
N |
Default(默认) |
Y |
Y |
Y |
N |
N |
private |
Y |
N |
Y |
N |
N |
十二 .抽象类和抽象方法
抽象类和抽象方法的关系:
①抽象类中可以有成员变量、构造方法、成员方法。
②抽象类中可以没有抽象方法,也可以有抽象方法。
③拥有抽象方法的类必须是抽象类,因此真正意义上的抽象类应该是具有抽象方法并且使用 abstract关键字修饰的类。
抽象类和普通类的差别:
①抽象类不能直接实例化,只能被继承的子类实例化。
②抽象类可以有抽象方法,也可以没有抽象方法。普通类中不能有抽象方法。
十三. 内部类
当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类。
内部类分类:
①普通内部类 - 直接将一个类的定义放在另外一个类的类体中。
• 普通内部类和普通类一样可以定义成员变量、成员方法以及构造方法等。
• 普通内部类和普通类一样可以使用final或者abstract关键字修饰。
• 普通内部类还可以使用private或protected关键字进行修饰。
• 普通内部类需要使用外部类对象来创建对象。
• 如果内部类访问外部类中与本类内部同名的成员变量或方法时,需要使 用this关键字。
②静态内部类 - 使用static关键字修饰的内部类,隶属于类层级。
• 静态内部类不能直接访问外部类的非静态成员。
• 静态内部类可以直接创建对象。
• 如果静态内部类访问外部类中与本类内同名的成员变量或方法时,需要使用类名.的方式访问。
③局部内部类 - 直接将一个类的定义放在方法体的内部时。
• 局部内部类只能在该方法的内部可以使用。
• 局部内部类可以在方法体内部直接创建对象。
• 局部内部类不能使用访问控制符和static关键字修饰符。
• 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局部变量的声明周期不同所致。
④匿名内部类 - 就是指没有名字的内部类。
• 接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };
例如:
AnonymousInterface ait = new AnonymousInterface() { @Override public void show() { System.out.println("匿名内部类就是这么玩的,虽然你很抽象!"); } };
// 从Java8开始提出新特性lamda表达式可以简化上述代码,格式为:(参数列表) -> {方法体} AnonymousInterface ait2 = () -> System.out.println("lamda表达式原来是如此简单!"); AnonymousInterfaceTest.test(ait2);
|
十四.回调模式
概念: 回调模式是指——如果一个方法的参数是接口类型,则在调用该方法时, 需要创建并传递一个实现此接口类型的对象;而该方法在运行时会调用 到参数对象中所实现的方法(接口中定义的)。
十五.抽象类和接口的区别
定义抽象类的关键字是abstract class,而定义接口的关键字是interface。
1.继承抽象类的关键字是extends,而实现接口的关键字是implements。
2.继承抽象类支持单继承,而实现接口支持多实现。
3.抽象类中可以有构造方法,而接口中不可以有构造方法。
4.抽象类中可以有成员变量,而接口中只可以有常量。
5.抽象类中可以有成员方法,而接口中只可以有抽象方法。
6.抽象类中增加方法时子类可以不用重写,而接口中增加方法时实现类需要重写(Java8以前的版本)。
7.从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
8.从Java9开始增加新特性,接口中允许出现私有方法。
十六.多态的特点
①当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用父类独有的方法。
例如:
Metal mt = new Gold(); // 1.声明接口类型的引用指向实现类的对象,形成了多态。(注:Metal是接口,Gold是实现它的类)
②当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用子类独有的方法。
③对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本(动态绑定)。
④对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本。
十七.引用类型转换注意事项
①强制类型转换主要指大类型向小类型的转换,也就是父类转为子类,也叫做向下转型或显式类型转换。引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
②若强转的目标类型并不是该引用真正指向的数据类型时则编译通过,运行阶段发生类型转换异常。
③为了避免上述错误的发生,应该在强转之前进行判断,格式如下: if(引用变量 instanceof 数据类型) 判断引用变量指向的对象是否为后面的数据类型。
十八.枚举
概念:
① 使用public static final表示的常量描述较为繁琐,使用enum关键字来定 义枚举类型取代常量,枚举类型是从Java5开始增加的一种引用数据类型。
②枚举值就是当前类的类型,也就是指向本类的对象,默认使用public static final关键字共同修饰,因此采用枚举类型.的方式调用。
③ 枚举类可以自定义构造方法,但是构造方法的修饰符必须是private,默 认也是私有的。
常见方法如下:
static T[] values() |
返回当前枚举类中的所有对象 |
String toString() |
返回当前枚举类对象的名称 |
int ordinal() |
获取枚举对象在枚举类中的索引位置 |
static T valueOf(String str) |
将参数指定的字符串名转为当前枚举类的对象 |
int compareTo(Eo) |
比较两个枚举对象在定义时的顺序 |
枚举类实现接口的方式:
枚举类实现接口后需要重写抽象方法,而重写方法的方式有两种:重写 一个,或者每个对象都重写。
十九.注解
概念:
① 注解(Annotation)又叫标注,是从Java5开始增加的一种引用数据类型。
② 注解本质上就是代码中的特殊标记,通过这些标记可以在编译、类加载、 以及运行时执行指定的处理。
使用方式:
① 注解体中只有成员变量没有成员方法,而注解的成员变量以“无形参的方 法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该 成员变量的类型。
② 如果注解只有一个参数成员,建议使用参数名为value,而类型只能是八 种基本数据类型、String类型、Class类型、enum类型及Annotation类型。
注解种类:
自定义注解:
语法: 访问修饰符 @interface 注解名称 { 注解成员; }
元注解:
①元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到 其它的注解上面。
②元注解主要有 @Retention、@Documented、@Target、@Inherited、 @Repeatable。
预制注解:
③预制注解就是Java语言自身提供的注解,例如: @author, @version, @see, @since, @param, @return, @exception,(常见@Override, @Deprecated, @SuppressWarnings)。
本文地址:https://blog.csdn.net/illovesoftware/article/details/108846291
推荐阅读
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
-
java面向对象基础_final详细介绍
-
C#基础之数组排序、对象大小比较实现代码
-
ES6基础之 Promise 对象用法实例详解
-
ES6基础之数组和对象的拓展实例详解
-
Java面向对象编程之类的继承详解
-
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
-
浅析Objective-C的程序结构及面向对象的编程方式
-
PHP 中的面向对象编程:通向大型 PHP 工程的办法