java是面向对象编程
1.封装、继承、多态
1.封装:
封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
get和set方法
2.继承:
继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
关于继承如下 3 点请记住:
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。。
3.多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
多态的实现方式:
重写
接口
抽象类和抽象方法
2.接口和抽象
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
抽象类(abstract)和接口(interface)的区别
- 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
- 接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
- 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
- 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
- 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。
3.类和对象
对象:
一切都是对象
对象具有状态,一个对象用数据值来描述它的状态。java通过定义成员来描述对象的状态;通过为对象定义方法来描述对象的行为。
对象实现了数据和操作的结合,对象把数据和对数据的操作封装成一个有机的整体。
对象时java程序的核心,所以java里的对象具有唯一性,每个对象都有一个标识来引用它,如果某个对象失去了标识,这个对象就变成了垃圾,只能等着系统垃圾回收机制来回收它。java中不允许直接访问对象,而是通过对对象的引用来操作对象。
类:
具有相同或相似性质的一组对象的抽象就是类,类是对一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的个体。
对象的抽象是类,类的具体话就是对象。
对一个定义类而言,可以包含三种最常见的成员:构造器、成员变量和方法,三种成员都可以定义零个或多个。
4.修饰符
权限修饰符
修饰符 | 当前类 | 同 包 | 子 类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
状态修饰符
final
final关键字是最终的意思,可以修饰成员方法、成员变量、类。
final修饰的特点
- 修饰方法:表明该方法是最终方法,不能被重写。
- 修饰变量:表明该变量是常量,不能再次被赋值。
- 修饰类:表明该类是最终类,不能被继承。
修饰局部变量
- 变量是基本类型:final修饰指的是基本类型的数据值不能发生改变。
- 变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。
static
static是静态的意思,可以修饰成员方法,成员变量。
static修饰的特点
- 该类的所有对象共享
修饰函数:
非静态的成员方法
- 能访问静态的成员变量
- 能访问非静态的成员变量
- 能访问静态的成员方法
- 能访问非静态的成员方法
静态的成员方法
- 能访问静态的成员变量
- 能访问静态的成员方法
5.方法
java语言里方法的所属性主要体现在:
1.方法不能独立定义,方法只能在类体里定义;
2.从逻辑意义上看,方法要么属于该类本身,要么属于该类的一个对象;
3.永远不能独立执行方法,执行方法必须使用类或对象作为调用者。
使用static修饰的方法属于这个类本身,使用static修饰的方法既可以使用类作为调用者来调用,也可以使用对象作为调用者来调用。但是值得指出的是,因为使用static修饰的方法还是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,这是由于底层依然时使用这些实例所属的类作为调用者。
没有static修饰的方法则属于该类的对象,不属于这个类的本身。因此没有static修饰的方法只能使用对象作为调用者来调用,不能使用类作为调用者来调用。使用不同对象作为调用者来调用同一个普通方法,可能得到不同的结果。
长度可变的形参只能处于形参列表的最后。一个方法中最多只能包含一个长度可变的形参。长度可变的形参本质就是一个数组类型的形参,因此调用包含一个长度可变形参的方法时,这个长度可变的形参既可以传入多个参数,也可以传入一个数组。
6.重载和重写
在一个类中出现了同名的方法,但是他们的参数列表不一样。(参数列表的不同包括:类型不同,个数不同,顺序不同)
重载的注意事项:
1.重载和返回值类型没有关系;
2.重载和参数名没有关系;
3.重载方法在调用的时候是通过参数列表去区分的。
重载和重写:
重载主要发生在同一个类的多个同名方法之间;
重写发生在子类和父类的同名方法之间。
@Overread
Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用。当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错误信息。
重载:重载的时候,方法名要一样,但是参数类型或个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
覆写(重写):若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
@Override
public void onCreate(Bundle savedInstanceState)
{…….}
这种写法是正确的,如果你写成:
@Override
public void oncreate(Bundle savedInstanceState)
{…….}
编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a @Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法:oncreate
7.成员变量和局部变量
-
定义和作用域
- 成员变量:
在类里定义的变量。
类变量--有static修饰
实例变量--无static修饰
- 局部变量:
在方法里定义的变量。
-
初始值:
成员变量不需要设置初始值,会默认有一个初始值。
局部变量需要设置初始值
-
两类变量同名时,局部变量具有更高的优先级。
-
能用代码块局部变量就不要用方法局部变量,能用局部变量就不要用成员变量,减少内存开销,提高程序内聚性。
网友评论