1.接口
Interface interName,只能有抽象或者默认方法
2.对象转型(把右边的当做左边来用,看说得通不)
引用类型与对象类型
ADHero ad = new ADHero();//ad是引用,new ADHero()是对象
//引用和对象都是ADHero类型的。
接下来讨论引用类型和对象类型不一致情况下的转换问题
子类转父类(向上转型),ok
父类转子类(向下转型),需要强转,有时可以有时不行
Hero h =new Hero();
ADHero ad = new ADHero();//ADHero extends Hero,implements AD
Support s =new Support();//Support extends Hero,implements Healer
h = ad;//父类引用指向子类对象,将右边子类当成左边父类来用ok
ad = (ADHero) h;//h指向ADHero,转换成ADHero类型ok
h = s;//父类引用指向子类对象,将右边子类当成左边父类来用ok
ad = (ADHero)h;//h指向Support类型,转换失败
没有继承关系的两个类相互转换,No
实现类转换成接口(向上转换,ok)
接口转换成实现类(向下转换)
ADHero ad = new ADHero();
AD adi = ad;//向上ok
ADHero adHero = (ADHero) adi;//adi实际就指向ADHero,ok
ADAPHero adapHero = (ADAPHero) adi;//No
adapHero.magicAttack();//假设转换成功那ap接口中的方法肯定可以用
//而adi指向的ADHero中没有ap的方法
instanceof
instanceof Hero 判断一个引用所指向的对象,是否是Hero类型,或者Hero的子类
System.out.println(h1 instanceof Hero);
3.重写 覆盖override
子类可以继承父类的对象方法 在继承后,
重复提供该方法(改写一下提供不一样的东西),就叫做方法的重写 又叫覆盖
4.多态:
操作符的多态
+ 可以作为算数运算,也可以作为字符串连接
int i = 5;
int j = 6;
int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加
System.out.println(k);
int a = 5;
String b = "5";
String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接
System.out.println(c);
类的多态(条件:父类/接口引用指向子类对象+调用的方法有重写)
Item i1= new LifePotion();
Item i2 = new MagicPotion();//两个父类引用指向不同的子类对象
System.out.print("i1 是Item类型,执行effect打印:");
i1.effect();
System.out.print("i2也是Item类型,执行effect打印:");
i2.effect();//两个子类对象中分别重写了父类中的effect方法,输出不同的结果
父类引用指向子类对象 都是同一个类型,调用同一个方法,却能呈现不同的状态
5.隐藏:就是子类覆盖父类的类方法(覆盖是对象方法注意区分)
子类隐藏父类的类方法后
如果一个父类类型的引用指向一个子类类型的对象/或者指向null
调用方法仍是父类的该方法而不是子类提供的方法
所以和引用指向哪个对象无关而是取决于引用本身的类型
当然,也不建议通过对象去调用类方法,而应该直接通过类取调用类方法,从而规避理解上的歧义。
6.super
实例化一个对象时其构造方法会被调用而且是先调用父类的构造方法,子类构造方法默认调用父类无参构造方法。也可以用super(paramters)显式调用父类带参构造方法
super.attributeName访问父类属性//该属性被重写时
super.FuncName调用父类对象方法//该方法被重写时
7.Object类是所有类的父类
Object类提供的方法
toString();//返回当前对象的字符串表达
finalize();//当一个对象没有任何引用指向的时候就可以被回收了
//被垃圾回收的时候,它的finalize() 方法就会被JVM(而不是开发人员)调用
equals();//用于判断两个对象的内容是否相同
==//这不是Object的方法,但是用于判断两个引用是否指向同一个对象
hashCode();//返回一个对象的哈希值
wait(),notify(),notifyAll()//线程同步方法
getClass()会返回一个对象的[类对象]
7.final
修饰类,不能被继承
修饰方法,不能被重写
修饰基本类型变量,表示该变量只有一次赋值机会
修饰引用 ,表示该引用只有1次指向对象的机会
常量,public static final,可以公开,直接访问,不会变化的值
String类是final的,不能被继承哦
8.抽象类
在类中声明一个方法,这个方法没有实现体,是一个“空”方法
这样的方法就叫抽象方法,使用修饰符“abstract"
当一个类有抽象方法的时候,该类必须被声明为抽象类
抽象类可以没有抽象方法,抽象类不能够被直接实例化
继承抽象类的子类必须提供父类中所有抽象方法的实现
抽象类和接口的区别:
1.子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
2. 抽象类可以定义public,protected,package,private,静态和非静态属性,final和非final属性
但是接口中声明的属性,只能是public 静态 final的 即便没有显示的声明
3.注: 抽象类和接口都可以有实体方法。 接口中的实体方法,叫做[默认方法]
(http://how2j.cn/k/interface-inheritance/interface-inheritance-default-method/676.html)
9.内部类:
分为四种:
非静态内部类:new 外部类().new 内部类()
//可以直接在一个类里面定义,可以直接访问外部类的private实例属性
//只有一个外部类对象存在的时候,才有意义
静态内部类 :new 外部类.静态内部类();
//不可以访问外部类的实例属性和方法(因为没有一个外部类的实例)
//静态内部类可以直接实例化不需要一个外部类的实例为基础
//除了可以访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别
匿名类 指的是在声明一个类的同时实例化它
//要使用一个接口或者抽象类,都必须创建一个子类
有的时候,为了快速使用,直接实例化一个抽象类,并“当场”实现其抽象方法。
//在匿名类中使用外部的局部变量,外部的局部变量必须修饰为final
本地类//有名字的匿名类
//内部类必须声明在成员的位置,即与属性和方法平等的位置。
//本地类和匿名类一样,直接声明在代码块里面,可以是主方法,for循环里等等地方
10.默认方法(接口也可以提供具体方法了而不是只能抽象方法)
该方法用default来声明
网友评论