------- android培训、java培训、期待与您交流! ----------
1:多态
(1)对象在不同时刻表现出来的不同状态。
举例:水(冰,水,水蒸气)
(2)多态的前提
A:要有继承或者实现关系。
B:要有方法的重写。
C:要有父类引用或者父接口引用指向子类对象。
注意:多态有三种体现形式
类多态
抽象类多态
接口多态
(3)多态中的成员特点:
A:成员变量
编译看左边,运行看左边。
B:成员方法
编译看左边,运行看右边。
此特点是因为方法存在重写,而变量没有。
举例:孔子装爹。
孔子爹:讲课("JavaSE"),age=40
孔子:讲课("论语"),玩游戏(),age=20
//多态
孔子爹 k爹 = new 孔子(); //装爹,打扮的和爹一样。
System.out.println(k爹.age);//40
k爹.讲课(); //论语
//k爹.玩游戏(); //有问题
//讲了一天课,很累
孔子 k = (孔子)k爹; //去掉爹的装备
System.out.println(k.age);
k.讲课();
k.玩游戏();
(4)多态的弊端:
父类(接口)引用不能使用子类特有功能。
为了解决这个弊端,我们需要向下转型。
Fu f = new Zi(); //向上转型
Zi z = (Zi)f; //向下转型
Zi z = new Zi();
(5)多态的好处:
可以提高代码的扩展性和可维护性。
代码举例:
class Animal
{
public void show()
{
System.out.println("show Animal");
}
}
class Cat extends Animal
{
public void show()
{
System.out.println("show Cat");
}
public void playGame()
{
System.out.println("捉迷藏");
}
}
class Dog extends Animal
{
public void show()
{
System.out.println("show Dog");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
//多态
Animal a = new Dog(); //向上转型
a.show();
//给a重新赋值
a = new Cat(); //向上转型
a.show();
Cat c = (Cat)a; //向下转型
c.show();
c.playGame();
Dog d = (Dog)a;
d.show();
}
}
继承
(1)把多个类中的相同的属性和行为进行抽取,封装到一个类中,
然后再建立新类的时候,不需要从头做起,继承刚才定义的那个类即可。
(2)好处:
A:提高代码的复用性。
B:让类与类之间产生了一个关系,是多态的前提。
(3)什么时候使用继承?
A:如果类之间存在着:
is a 的关系,就可以考虑使用继承。
B:不要为了继承部分功能,而去使用继承。
(4)继承的特点:
A:Java只支持单继承,不支持多继承。
为什么?如果支持多继承,就会有调用不明确的问题。
B:Java支持多层(重)继承。
(5)super和this的区别?
A:super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
B:它和this的用法相似
a:成员变量
this.变量 -- 本类的
super.变量 -- 父类的
b:构造方法
this(...) -- 本类的
super(...) -- 父类的
c:成员方法
this.方法名() -- 本类的
super.方法名() -- 父类的
(6)子父类中成员变量的用法:
A:名称不同,这个太简单了。
B:名称相同,子类对象的在使用的时候:
先找子类局部范围
再找子类成员范围
最后找父类成员范围
(7)子父类中成员方法的用法:
A:名称不同。
B:名称相同,子类对象的在使用的时候:
先找子类的
再找父类的
C:方法重写
在子类中,方法声明(修饰符,返回值,方法名,参数列表)相同的情况。
注意事项:
a:父类中私有方法是不能被重写
b:子类方法的访问权限一定要大于等于父类的访问权限
(8)子父类中构造方法的用法:
A:子类的初始化过程中,首先回去执行父类的初始化动作。
因为子类的构造方法中默认有一个super()。
为什么?子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。
所以,子类的初始化过程中,会先执行父类的初始化。
B:如果父类没有无参构造方法
A:使用super调用父类的带参构造。推荐方式。
B:使用this调用本身的其他构造。
3:代码块
(1)执行顺序:
静态代码块 --> 构造代码块 --> 构造方法
(2)注意事项:
静态代码块只执行一次
4:final
(1)是一个关键字,可以用于修饰类,成员变量,成员方法。
(2)特点:
它修饰的类不能被继承。
它修饰的成员变量是一个常量。
它修饰的成员方法是不能被子类重写的。
代码举例:
class Person
{
public void show()
{
System.out.println("person");
}
}
/*
class School
{
public void show()
{
System.out.println("school");
}
}
*/
//class Student extends Person,School
class Student extends Person
{
public void method()
{
System.out.println("method");
}
}
class Coder extends Student
{
}
class ExtendsDemo2
{
public static void main(String[] args)
{
Person p = new Person();
p.show();
System.out.println("------");
Student s = new Student();
s.show();
s.method();
System.out.println("------");
Coder c = new Coder();
c.show();
c.method();
}
}