- 现实生活中由很多很多对象组成的,基于对象抽出了类
- 对象:软件中真实存在的单个东西/个体
- 类:类别/类型/模板,代表一类个体
- 类是对象的模子,对象是类的具体的实例
- 类中可以包含:
1)对象所共有的属性/特征--------------------------成员变量
2)对象所共有的行为/动作--------------------------方法 - 一个类可以创建多个对象
- 发生在同一类中,方法名相同,参数列表不同
- 编译器在编译时会根据方法的签名自动绑定调用的方法
- 给成员变量赋初始值
- 与类同名,没有返回值类型(连void都没有)
- 在创建(new)对象时被自动调用
- 若自己不写构造方法,则编译器默认提供一个无参构造方法
- 若自己写了构造方法,则不再默认提供
- 构造方法可以重载
1、指代当前对象,哪个对象调用方法它指的就是哪个对象
2、只能用在方法中,方法中访问成员变量之前默认有个this.
- this的用法:
1) this.成员变量名------------------------访问成员变量
注意: 当成员变量与局部变量同名时,访问成员变量时this不能省略
2)this.方法名()-----------------------------调用方法(一般不用)
3)this()---------------------------------------调用构造方法(一般不用)
1、若引用的值为null,则该引用不能再进行任何点操作了
2、若操作则发生NullPointerException空指针异常
1) Student[] stus = new Student[3];
stus[0] = new Student("zhangsan",25,"LF");
stus[1] = new Student("lisi",26,"JMS");
stus[2] = new Student("wangwu",24,"SD");
System.out.println(stus[0].name); //输出第1个学生的名字
stus[1].age = 27; //给第2个学生的年龄修改为27
stus[2].sayHi(); //第3个学生跟大家问好
for(int i=0;i //遍历所有学生
System.out.println(stus[i].name); //输出每个学生的名字
stus[i].sayHi(); //每个学生跟大家问好
}
2) Student[] stus = new Student[]{
new Student("zhangsan",25,"LF"),
new Student("lisi",26,"JMS"),
new Student("wangwu",24,"SD")
};
9、继承
- 作用:代码复用
- 通过extends来实现继承
- 超类/父类:派生类所共有的属性和行为
- 派生类/子类:派生类所特有的属性和行为
- 派生类及可以访问自己的,也可以访问超类的。而超类只能访问超类自己的
- 一个超类可以有多个派生类,但一个派生类只能继承一个超类------单一继承
- 继承具备传递性
- java规定:构造派生类之前必须先构造超类
1)在派生类的构造方法中,若没有调用超类的构造方法
-----则编译器默认super()调用超类的无参构造方法
-----注意:super()调用超类构造方法必须位于派生类构造方法的第一行
2)在派生类的构造方法中,若调用了超类的构造方法
-----则不再默认提供
10、super:指代当前对象的超类对象
super的用法:
- super.成员变量名-------------------------访问超类的成员变量
- super.方法名()-----------------------------调用超类的方法
- super()---------------------------------------调用超类的构造方法
- 超类型的引用指向派生类的对象
- 能点出来什么,看引用的类型
- 发生在父子类中,方法名相同,参数列表相同
- 重写方法被调用时,看对象的类型
- 遵循"两同两小一大"原则:
1)两同:
1.1)方法名相同
1.2)参数列表相同
2)两小:
2.1)派生类方法的返回值类型小于或等于超类方法的
2.1.1)void时,必须相同
2.1.2) 基本类型时,必须相同
2.1.3)引用类型时,小于或等于
2.2)派生类方法抛出的异常小于或等于超类方法的
3)一大
3.1)派生类方法的访问权限大于或等于超类方法的
- 重写(override/overriding): 发生在父子类中,方法名相同,参数列表相同
- 重载(overload/overloading):发生在同一类中,方法名相同,参数列表不同
- 作用:避免类的命名冲突
- 同包中的类不能同名,不同包中的类可以同名
- 类的全称:包名.类名,包名常常有层次结构
- 建议:包名所有字母都小写
- 同包中的类可以直接访问
- 不同包中的类不能直接访问,若想访问:
1)先import声明类再访问类------建议
2)类的全称----------------------------太繁琐、不建议
- public:公开的,任何类
- private:私有的,本类
- protected:受保护的,本类、派生类、同包类
- 默认的:什么也不写,本类、同包类----------------------java不建议默认权限
- 说明:
1)类的访问权限只能是public或默认的
2)类中成员的访问权限如上四种都可以
- 修饰变量:变量不能被改变
- 修饰方法:方法不能被重写
- 修饰类:类不能被继承
1)静态变量:
1.1)由static修饰
1.2)属于类,存储在方法区中,只有一份
1.3)常常通过类名点来访问
1.4)何时用:所有对象所共享的数据(图片、音频、视频等)
2)静态方法:
2.1)由static修饰
2.2)属于类,存储在方法区中,只有一份
3.3)常常通过类名点来访问
2.4)静态方法中没有隐式this传递,所以在静态方法中不能直接访问实例成员
2.5)何时用:方法的操作与对象无关
3)静态块:
3.1)由static修饰
3.2)属于类的,在类被加载期间自动执行,
因为一个类只被加载一次,所以静态块也只执行一次
3.3)何时用:加载/初始化静态资源(图片、音频、视频等)
19、static final常量:应用率高
- 必须声明同时初始化
- 通过类名点来访问,不能被改变
- 建议:常量名所有字母都大写,多个单词之间用_分隔
- 编译器在编译时会将常量直接替换为具体的值,效率高
- 何时用:数据永远不变,并且经常使用
- 由abstract修饰
- 包含抽象方法的类必须是抽象类
- 抽象类不能被实例化(new对象)
- 抽象类是需要被继承的,派生类:
1)重写所有抽象方法-----------------变不完整为完整
2)也声明为抽象类--------------------一般不这么用 - 抽象类的意义:
1)封装共有的属性和行为--------------代码复用
2)为派生类提供统一的类型-----------向上造型
3)可以包含抽象方法,为所有派生类提供统一的入口(造型后能点出来)
派生类的行为不同,但入口是一致的
1.问:觉得超类中的抽象方法step()可有可无? 答:必须有,超类中的抽象方法可以保证,当向上造型时,通过超类的引用能点出 step()来------意义就是保证造型之后能出来 2.问:将step()设计为普通方法,也能点出来,为什么要设计为抽象方法 答:设计为普通方法时,派生类可以重写也可以不重写,而设计为抽象方法,则可以强 制派生类必须重写-------意义就是抽象方法能达到一种强制重写的目的21、成员内部类:应用率极低
- 类中套类,外面的称为外部类,里面的称为内部类
- 内部类通常只服务于外部类,对外不具备可见性
- 内部类对象只能在外部类中创建
- 内部类中可以直接访问外部类的成员(包括私有的)
内部类中有个隐式的引用指向了创建它的外部类对象
语法:外部类名.this
问:内部类有独立的.class吗? 答:有
做功能的套路: 1.先写行为/方法: 1)若为某个类所特有的行为,则将方法设计在特定的类中 2)若为派生类所共有的行为,则将方法设计在超类中 2.窗口调用: 1)若为定时发生的,则在定时器中调用 2)若为事件触发的,则在侦听器中调用22、接口
- 是一种数据类型(引用类型)
- 由interface定义
- 只能包含常量和抽象方法
- 接口不能被实例化
- 接口是需要被实现/继承的,实现类/派生类:必须重写所有抽象方法
- 一个类可以实现多个接口,用逗号分隔,若又继承又实现时,应先继承后实现
- 接口可以继承接口
设计规则: 1)将所有派生类所共有的属性和行为,抽到超类中-----------抽共性 2)若派生类的行为都一样,设计为普通方法 若派生类的行为不一样,设计为抽象方法 3)将部分派生类所共有的属性和行为,抽到接口中 接口是对继承单根性的扩展-------------------实现多继承
调错技巧: 1.如何锁定错误位置: ----将方法的调用代码注释,而后一个一个的放开,看哪个方法放开之后出现的问题 2.如何打桩: ----在你认为错误的位置,通过System.out.println()输出数据的值
类和类--------------------继承 接口和接口--------------继承 类和接口-----------------实现23、多态
- 意义:
1)同一类型的引用指向不同的对象时,有不同的实现
-----行为的多态:cut()、step()、getImage()… 所有抽象方法都是多态的
2)同一个对象被造型为不同的类型时,有不同的功能
------对象的多态:我、你、水…---------------------所有对象都是多态的 - 向上造型/自动类型转换:
1)超类型的引用指向派生类的对象
2)能向上造型成为的类型有:超类+所实现的接口
3)能点出来什么,看引用的类型 - 强制类型转换,成功的条件只有如下两种情况:
1)引用所指向的对象,就是该类型
2)引用所指向的对象,实现了该接口或继承了该类 - 强转时若不符合如上两种情况,则发生ClassCastException类型转换异常,建议:在强转之前要先通过instanceof来判断引用的对象是否是该类型



