教材学习内容总结
1.子类与父类
1.1子类
子类继承一般类的属性和行为,并根据需要增加它自己的新的属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己的新的属性与行为的的的.java不支持多重继承,即子类只能有一个父类。
对象是所有类的祖先类。
class 子类名 extends 父类名 {
......
}
example:
class Student extends People {
...
}
2.子类的继承性
2.1子类与父类在同一包中:
继承不是私有的成员变量及方法,访问权限保持不变。
2.2子类与父类不在同一包中:
私人及友好访问权限的不可继承,只继承父类中的保护和公共方法和成员变量。
2.3protect
如果在本类中创建对象,这个对象可以通过访问继承或定义的保护的变量或方法“”;
如果在其他类中创建对象:
(1)如果在同一包中,则可以访问;
(2)与父类在同一包中,也可访问。
3.子类与对象
3.1子类对象的特点
子类被创建时,父类的成员变量也会被分配内存空间,即使是私人的。
可以调用从父类继承的方法调用未继承的变量。
3.2 instanceof
用法:对象的的instanceof类
如果是父类,也会返回真
4.成员变量的隐藏和方法重写
4.1
声明的变量与父类的变量名一致,子类就会隐藏父类的变量。
但是!子类依然可以用继承来的方法调用继承或者隐藏的变量。
4.2方法重写
也称方法覆盖。
规则:只要可以继承,就可以重写。
目的:通过重写可以隐藏继承的方法重写的方法可以操作继承的变量,调用继承的方法,也可以操作新声明的变量,调用新定义的方法,但无法操作被隐藏的变量和方法如果想使用被隐藏的方法或变量,需要使用超级。
覆盖必须要方法名字,参数个数,参数类型和父类的方法完全相同。
静态的方法不可以被覆盖。(就是静态)
重写方法的类型可以是父类方法类型的子类型,
例如:父类:人子类:学生
重写方法的类型可以是学生类。
注意:重写方法不允许降低方法的访问权限,但可以提高访问权限
访问权限从高到底排列:公共>保护>友好>私人
5.super关键字
5.1超级
如果想使用被隐藏的变量或方法,需要在前面添加超。
例如:
example.java
class Sum {
int n;
float f() {
float sum = 0;
for ( int i=1;i<=n;i++)
sum = sum+i;
return sum;
}
}
class Average extends Sum {
int n;
float f() {
float c;
super.n=n;
c= super.f();
return c/n;
}
float g() {
float c;
c=super.f();
return c/2;
}
}
public class example{
public static void main(String args[]) {
Average aver = new Average ();
aver.n = 100;
float resultOne = aver.f();
float resultTwo = aver.g();
System.out.println ("resultOne="+resultOne);
System.out.println ("resultTwo="+resultTwo);
}
}
5.2super调用父类的构造方法
用子类的构造方法创建对象时,子类默认调用父类的不带参数的构造方法。
如果需要指定调用某个构造方法,就需要在子类的构造方法中使用的超级调用父类的构造方法。
而且超级必须是子类构造方法中的头一条语句。
6.final
用最终修饰的类将不能被继承,即不能有子类;
用最后的修饰的父类中的方法不允许子类重写,即不允许子类隐藏可以继承的最终方法。
用最后的修饰的变量即为常量。
7.对象的上转型对象(重点)
类似于说“老虎是动物”这种上溯思维方式,用子类创建一个对象,并把对象的引用放到类的对象,例如:
Animal a;
Tiger b=new Tiger();
a=b;
我们称对象一个是对象b的上转型对象。
动物既可以是一般类,还可以是接口,抽象的。
上转型对象不能操作子类新增的成员变量(失去了这部分属性),不能调用子类新增的方法(失掉了这一部分的行为)。
子类中与父类同名的属性也算作子类新增属性,不能被调用。
我们在程序中显示调用的那个同名属性事实上是属于父类的被隐藏属性,输出值当然会是父类的值。
方法:上转型对象调用的方法,要么是直接从父类那继承未被重写的方法,要么是被子类重写过的方法,不可能是隐藏方法。
如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。(静态)
可以将对象的上转型对象再强制转换到一个子类对象,这时该子类对象又具备了子类的所有属性和功能。
例如:
Tiger b = (Tiger)a;
8.abstract类和抽象方法
用抽象修饰的类叫做抽象类,修饰的方法叫做抽象方法。
抽象方法只允许声明,没有实现。
不允许用最后的和抽象的同时修饰一个方法和类,不允许用静态修饰抽象方法,因为抽象的方法必须是实例方法。实
例方法必须在对象实例化之后,通过对象引用来调用。方法静态即不需要对象实例就可以调用的方法,也叫做类方法,
可以通过类名直接调用。
抽象类中既可以有抽象的方法,也可以有非抽象的方法。
抽象类因为是抽象的,所以不能直接用新的运算符创建对象。
继承:子类为非抽象类:必须重写父类的抽象方法(去掉抽象方法的抽象,给出方法体);子类为抽象
类:可以重写抽象的方法,也可以继承父类的抽象方法。
可以用抽象类声明对象,该对象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法。
抽象方法主要用来制定行为标准。
例如:
abstract class GirlFriend{ //抽象类,封装了两个行为标准
abstract void speak();
abstract void cooking();
}
class ChinaGirlFriend extends GirlFriend{
void speak(){
System.out.println("你好");
}
void cooking(){
System.out.println("水煮鱼");
}
}
class AmercanGirlFriend extends GirlFriend{
void speak(){
System.out.println("hello");
}
void cooking(){
System.out.println("roast beef");
}
}
class boy{
GirlFriend friend;
void setGirlFriend(GirlFriend f){
friend=f;
}
void showGirlFriend(){
friend.speaking();
friend.cooking();
}
}
public class text{
public static void main(String args[]){
GirlFriend girl =new ChineseGirlFriend(); //这里girl是上转型对象
Boy boy=new boy();
boy.setGirlFriend(girl);
boy.showGirlFriend();
girl=new AmericanGirlFriend(); //girl 是上转型对象
boy.setGirlFriend(girl);
boy.showGirlFriend();
}
}
9.面向抽象编程
指当设计某种重要的类时,不是该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。
核心技术之一:使用上转型对象,即将抽象类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。
目的:为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。
核心:杨磊中每种可能的变化对应的交给抽象类的一个子类去负责,从而让类的设计者不去关心具体实现,避免所设计的类依赖于具体实现。
面向抽象编程使设计的类容易应对用户需求的变化。
10.开 - 闭原则
对拓展开放,对修改关闭。
教材学习中的问题与解决过程
对上转型与抽象类的知识点不通透
多问学委
代码调试中的问题与解决过程
无
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第六周 | 917分之325 | 1/5 | 10/48 | 抽象与继承 |
第五周 | 592分之443 | 1/4 | 16/38 | 类的用法 |
第四周 | 149分之96 | 1/3 | 8/22 | 基本语句的复习 |
第二周 | 53分之35 | 1/2 | 6/14 | 数据类型应用 |
第一周 | 18/18 | 1/1 | 8/8 | 日食的使用 |