回顾:
1.重写(override):
1)父子类中,方法签名相同,方法体不同
2)重写方法被调用时,看对象的类型
3)两同两小一大:
3.1)方法名同,参数列表同
3.2)子类返回值类型小于等于父类
3.2.1)void时,必须相同
3.2.2)基本类型时,必须相同
3.2.3)引用类型时,子类小于等于父类(父类大,子类小)
子类抛出的异常小于等于父类-----后期说
3.3)子类的访问权限大于或等于父类
2.重写与重载的区别
1)重写(override):父子类,方法名同,参数列表同
“运行期”绑定,看对象的类型调用方法
2)重载(overload):一个类,方法名同,参数列表不同
"编译期"绑定,看引用的类型绑定方法
3.package(声明包),import(声明类/引入类)
4.访问控制修饰符
public,protected,默认,private
对于类,只能用public或默认的
内部类,如上4种都可以
对于类的成员,如上4种都可以
5.static:静态的
1)修饰成员变量:静态变量(类变量)
类,方法区,一份,类名点访问
何时用: 当所有对象的数据都一样时使用
2)修饰方法:静态方法(类方法)
没有隐式的this传递,不能直接访问实例成员
何时用:方法的操作仅与参数有关,而与对象无关
3)块:静态块
类被加载期间自动执行,一次
何时用:初始化静态资源(图片、音频、视频......)
6.final:最终的
1)修饰变量:变量不能被改变
2)修饰方法:方法不能被重写
3)修饰类:类不能被继承
7.内部类:
1)类中套类,外面叫外部类,里面叫内部类
2)内部类只服务于外部类,对外不具备可见性
3)内部类对象在外部类中创建
4)内部类可以直接访问外部类的成员(包括私有)
内部类中有一个隐式的引用指向了创建它的外部类对象:
Mama.this.成员变量名
8.匿名内部类:
Aoo o = new Aoo(); //创建Aoo的对象
//1.创建了Aoo的一个子类,没有名字
//2.为该子类创建了一个对象,名为o
//3.大括号中的Aoo子类的类体
Aoo o = new Aoo(){
};
package a;
class Aoo{
}
package b;
class Aoo{
}
package c;
class Test{
main(){
a.Aoo o = new a.Aoo();
b.Aoo o1 = new b.Aoo();
}
}
正课:
1.static final常量:
1)必须声明同时初始化,不能修改,类名点来访问
2)常量名建议所有字母都大写
3)编译器编译时会直接替换为具体的值---效率高
2.抽象方法
1)由abstract修饰
2)只有方法的定义,没有方法的实现(连大括号都没有)
3.抽象类:
1)由abstract修饰
2)包含抽象方法的类必须是抽象类
不包含抽象方法的类也可以声明为抽象类-----我愿意
3)抽象类不能被实例化
4)抽象类是需要被继承的,子类:
4.1)重写所有的抽象方法----建议
4.2)声明为抽象类----不建议
5)抽象类的意义:
5.1)封装所有子类共有的数据和行为,实现代码重用
5.2)为所有子类提供了一种公共的类型(向上造型)
5.3)包含抽象方法,为所有子类提供一个统一的入口
4.接口:
1)是一个标准、规范-----制定方
遵守了这个标准,就能干某件事-----后期再理解
2)由interface定义
3)只能包含常量和抽象方法
4)接口不能被实例化
5)接口是需要被实现(implements)的,实现类:
必须重写接口中的所有抽象方法
6)一个类可以实现多个接口,用逗号分隔
若既继承又实现时,必须先继承,后实现
7)接口之间可以继承
7.1)类和接口之间为实现(implements)
7.2)接口和接口之间为继承(extends)
7.3)类和类之间为继承(extends)
interface UnionPay{ //银联接口
void 存钱();
void 取钱();
void 查余额();
}
interface ABC extends UnionPay{ //农行接口
void 支付电话费();
}
interface ICBC extends UnionPay{ //工行接口
void 在线支付();
}
class ABCImpl impelments ABC{ //农行卡
public void 存钱(){}
public void 取钱(){}
public void 查余额(){}
public void 支付电话费(){}
}
class ICBCImpl implements ICBC{ //工行卡
public void 存钱(){}
public void 取钱(){}
public void 查余额(){}
public void 在线支付(){}
}
UnionPayTest
Inter1 o1 = new Inter1(); //编译错误
Inter1 o1; //正确
Aoo o1 = new Aoo();
Inter2 o2 = new Aoo(); //向上造型
Inter1 o3 = new Aoo(); //向上造型
interface Inter1{
void a();
void b();
}
interface Inter2 extends Inter1{
void c();
}
class Aoo implements Inter2{
public void c(){}
public void a(){}
public void b(){}
}
interface Inter1{
void a();
}
interface Inter2{
void b();
}
abstract class Aoo{
abstract void c();
}
class Boo extends Aoo implements Inter1,Inter2{
public void a(){}
public void b(){}
void c(){}
}
interface Inter1{
void a();
void b();
}
class Aoo implements Inter1{
public void a(){}
public void b(){}
}
interface Inter1{
public static final int NUM=2;
public abstract void show();
void say(); //默认public abstract
double PI=3.14159; //默认public static final
}
生活中的接口:
1.电脑厂商做USB口------------------制定标准、规范
U盘、摄像头、充电线...----------遵守标准、规范
2.国家对商品房------------------------制定标准、规范
国家对家具、家电------------------制定标准、规范
开发商、家具厂商------------------遵守标准、规范
3.银行-------------------------------------制定标准、规范
银行卡----------------------------------遵守标准、规范
农行-----存钱、取钱、转帐、查余额、支付电话费
农行卡-----具备如上5个功能
工行-----存钱、取钱、转帐、查余额、在线支付
工行卡-----具备如上5个功能
abstract class 人{
abstract void study();
}
class 程序员 extends 人{
void study(){
}
}
class 医生 extends 人{
void study(){
}
}
class 警察 extends 人{
void study(){
}
}
abstract class Shape{ //抽象类----不完整
double c; //周长
abstract double area(); //抽象方法----不完整
}
class Circle extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0796*c*c;
}
}
class Square extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0625*c*c;
}
}
new Tetromino(); //编译错误
new Tetromino(); //永远不需要的
new T();
new J();
new O();
abstract class Tetromino{
Cell[] cells;
void drop(){}
void moveLeft(){}
void moveRight(){}
void print(){}
}
class T extends Tetromino{
}
class J extends Tetromino{
}
class O extends Tetromino{
}
给我一组图形,找到这一组图形中的最大面积:
Shape[] shapes = new Shape[6];
shapes[0] = new Circle(1);
shapes[1] = new Circle(2);
shapes[2] = new Square(1);
shapes[3] = new Square(2);
shapes[4] = new Six(1);
shapes[5] = new Six(2);
double max = shapes[0].area(); //1.Shape类中包含area(),保证能点出来 2.此处调用的中子类的area()方法,因重写后调谁看对象的类型
for(int i=1;i<shapes.length;i++){
double area = shapes[i].area();
if(area>max){
max = area;
}
}
System.out.println("max="+max);
abstract class Shape{ //抽象类----不完整
double c; //周长
abstract double area(); //抽象方法----不完整
}
class Circle extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0796*c*c;
}
}
class Square extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0625*c*c;
}
}
new Shape(); //编译错误
Shape s; //正确
abstract class Shape{ //抽象类----不完整
double c;
abstract double area(); //抽象方法----不完整
}
class Square extends Shape{
double area(){ //重写----变不完整为完整
return 0.0625*c*c;
}
}
class Circle extends Shape{
double area(){
return 0.0796*c*c;
}
}