一.类和对象
1.开篇瞎BB
物以类聚。
世间万物皆对象,对象是能接触到的实体。类是一组有相同属性和方法的对象的集合,或者说它们的特征提取,类是一种抽象的概念。类由属性和方法组成,属性是它的各种静态的特征,方法是它能干啥。《易》有云,“物以类聚,人以群分”。
打个比喻,有一群人都在追一个很可爱的姑娘。这群人可以抽象出一个类,他们有相同的属性,比如都喜欢这姑娘,都是男孩子。他们有一些相同的方法,什么送花儿呀,请吃饭呀,请看电影呀,陪姑娘聊天呀。所以呀,他们是一个类。而单独的一个人就是一个对象,这个对象一定具有这个类里的属性,也一定可以干这个类中的方法【人家干不干是另一说啊】,当然,也可以干其他各种各样不包含在类里的事。所以呀,姑娘选人不是看类的方法和属性,反正都是一样的,人看的是你此外还能干啥,也看的是你现有方法中,你咋个顺序干呢~【吐槽而已,认真你就输了】
类和对象毕竟只是一种静态的描述和表示,而程序是会运作起来的世界。人生有那么多种可能,而你却只能选择一条路。
2.定义类
//类名要求首字母大写
public class 类名
{
//属性(成员变量)
类型 类型名;
...
//方法
方法;
...
}
3.创建对象
类名 对象名=new 类名();
4.使用对象
对象名.属性
对象名.方法()
//float变量赋值需要加f,否则默认浮点数为double,如 float x; x = 0.5f;
5.成员变量和局部变量
成员变量是类中定义的,局部变量是类的方法中定义的。
作用域不同,局部变量只在方法内可用。
初始值得区别【成员变量自动赋初始值,局部变量需初始化】
6.构造方法
用于创建对象和初始化对象的值。其名称与类名同名,无返回值。
使用:new + 构造方法
【之前所用的创建对象相当于java自动创建了一个无参的构造方法,直接使用该无参的构造方法,若代码段中有构造方法,无论是有参还是无参,java都不会自动创建啦】
定义:
public 构造方法名() //有参无参均可
{
//初始化
}
7.static
直接在下述的定义前面加上static即定义为静态了。
a.静态变量
该类所有对象共享,属于整个类所有。可直接用类名访问,也可用对象名访问。【类名.属性】
第一次使用时就有了该变量,后面再创建该类的对象还是只有第一个的。
b.静态方法
静态方法可以直接调用静态变量,但不可直接调用非静态变量,若要调用非静态变量,可以创建类然后调用。
静态方法可以直接掉用静态方法,但不可直接调用非静态方法,若要调用非静态方法,可以创建类然后调用。
普通方法可以直接调用静态和非静态的变量。
【小结:非静态均可直接调用,静态只能直接调用静态。谁让他们都是些高冷的小傲娇!其他人就不理他们!】
c.静态初始化块
初始化块可以直接在类中通过大括号添加,创建类时就直接依次执行这些初始化块了。
静态初始化只在第一次创建该类对象时执行,只执行一次,且只能初始化静态变量。【傲娇小天团~】
类的三大特性:封装、继承、多态
二.封装:
1.定义和实现
定义:要求只通过类的方法对该类进行各种操作,把类的各种属性隐藏起来。就是“封装”的字面意思。
实现:将属性修改为private,用getter/setter方法进行属性的修改。【eclipse可自动生成,Source菜单】
一般getter方法名取为get+属性名首字母大写。
一般setter方法名取为set+属性名首字母大写。
2.包:
定义:用于管理java文件,解决类的同名问题。
package 包名; //使用,包名间使用.隔开,全小写,用于区分层次,类似于文件路径
//系统中的类也常用该命名方式:java.(功能).(类)
使用:
import 包名; //.*通配符,包括该目录下的所有
3.访问修饰符
本类 | 同包 | 子类 | 其他 | |
private | o | |||
默认 | o | o | ||
protected | o | o | o | |
public | o | o | o | o |
4.this关键字
表示当前对象
使用: this.属性
this.方法
5.内部类
定义在一个类里面的类。
使用:
Outter o = new Outter();
Inner i = o.new Inner(); //内部类名 对象名 = 外部对象名.new 内部类名()
a.成员内部类
定义:内部类做为外部类的一个成员存在。
内部类访问外部类时需要用this关键字。如: Outter.this.h //外部类名.this.属性
b.静态内部类
定义:对内部类加上static修饰符。
对外部类的非静态成员的访问:new 外部类().成员
外部类静态成员的访问: 类名.成员【同名】
成员【不同名】
创建时不需创建外部类,可直接创建内部类。
c.方法内部类
定义:定义在外部类的方法中,只能在该方法中使用。故不能使用访问修饰符和static修饰符。
三.继承
1.基本定义
字面意思,一个类(子类)继承了另一个类(父类)的属性和方法。【private修饰的属性和方法不可继承】【eclipse创建子类可直接选择继承父类,superclass】
class 子类 extends 父类
2.方法的重写
子类重写父类中有的方法。要求返回值、方法名、参数个数和类型均相同。使用时则优先使用子类的方法。
可以修改访问修饰符,重写的访问修饰符不能比原访问修饰严格。
3.final关键字
修饰类。该类不允许被继承
修饰方法。该方法不允许被重写(覆盖).
修饰属性、变量。变为常量。要求在定义时或构造方法中初始化,保证有且仅有一次的初始化。
4.super关键字
子类中使用,代表父类对象。
用法: super.属性 super.方法
子类构造必须调用父类构造方法,系统隐式调用父类的无参构造方法,显式书写必须写在子类构造方法的第一行。
5.Object类
该类是所有类的父类,根。
常用方法:
a.toString()
该方法直接调用返回对象的哈希code码,即地址。常重写该方法表示对象的属性。【eclipse可自动生成,Source菜单】
b.equals()
字面意思,比较是否相同。而现实中我们所谓的相同有两种。一种是世界上独一无二的同一个,比如你就是独一无二的,你的名字、身份证号反正都是指的你,都是相同的。一种是属性相同,比如说你们俩的校服一样。Object类中的equals方法比较的是第一种相同,即对象的使用是否指向同一块内存地址。常通过重写比较第二种相同。【eclipse可自动生成,Source菜单】该方法包含一个参数为对象的引用;返回类型为bool。此外,equals()重写中用到的getClass()方法得到类对象。区分类对象和类的对象,前者表示你有哪些种类的属性,后者表示该属性你具体值是多少。
四.多态
1.
关于引用,私以为,引用就是给你起个名字或者说拿个啥东西指代你,比如说你的小名啊、身份证号啊、外号啊,这都是引用,都是指你。但是引用不是你本身,只是指你而已,可以直接使用。类似指针。d
关于多态,就是对象的多种状态,有两种多态。一种是引用多态,一种是方法多态。
引用多态,是说父类的引用可以指向本类和子类的多态,但子类不能指向父类。说白了,你爸能给你起名字,你不能给你爸起名字。
父类名 引用名 = new 父类名或子类名();
方法多态,是说通过上面的引用多态创建了对象,如果是本类对象,调用的方法就是本类的方法;如果是子类的对象,调用的方法就是重写或者继承的方法;如果是子类对象独有的方法,那就不能使用。说白了,你爸给你起了名字,但你还是你自己,这个引用是你爸通过自己能干啥知道的你能干啥【因为继承】,但你很可能有些事儿有些本事你爸不造吧~那他就当然没法叫你干这种事儿了喽~
2.类型转换
对象间的类型转换类似一般的属性间的类型转换,父类为上,子类为下,向上可自动转换,向下强制转换,同级不可转换。用instanceof关键字判断该引用是否可以转换为该类型。
引用名 instanceof 类型名;//返回bool值,true为可以转换,false为不可转换
3.抽象类
约束所需的方法,不要求具体实现。需加上abstract关键字,可修饰类和方法。包含抽象方法的一定是抽象类,抽象类中可以有普通方法。
通过子类的继承,方法的重写,实现具体的方法。
其中abstract必须在最前面,eclipse可自动添加。
4.接口
感觉就是一种需求,用于继承和实现,所以必须是public。类似于类,定义不用class,用interface。其中属性一定是常量,方法一定是抽象方法,即全局常量和公共抽象方法。一个类可以实现多个接口,用implements,定义时写在继承的后面。用接口的引用直接new一个接口,使用匿名内部类可直接实现该接口的方法,并通过引用调用。接口名取名前一般加上I表示是接口(interface)