在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。
1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
不写时默认为friendly或者default叫啥的都有。网上有说默认为protected,其实并不是。默认的情况下,自己包内
的成员可以随便调用,别的包的成员即使是子类也不能调用。
老师的笔记:
OO三大特征: 继承、封装、多态
继承的目的: 减少多个class的共有的冗余代码,便于重用
封装的几个关键字总结:
private
只能被类自身调用
public
A、可以被类自身中的方法调用
B、可以在子类中直接调用父类的public属性和方法
C、可以被对象直接调用
protected
A、可以被类自身中的方法调用
B、可以在子类中直接调用父类的protected属性和方法
C、不能被对象直接调用(不同的包)
可以被本包的对象直接调用 dog.health
默认关键字
1. 可以在子类中直接调用父类的默认关键字修饰的属性和方法
2. 可以被本包的对象直接调用
不能被外部包的对象调用
//这几个关键字的比较,要从三个角度去比:子类、对象、包内/包外
protected关键字设计的初衷就是为了子类调用父类属性和方法设计的;
本包对象可以调用protected属性和方法,是friend(友元)的标示------ 用处很少
默认关键字:
设计的初衷就是包内可以调用、包外不能调用
is-a 与 has-a的关系
子类与父类的关系是is-a,反之不成立。 如Dog is a Pet
Person类中有一个Company的对象引用,表示这个Person属于哪个Company
或Student类中班级的对象引用,表示这个学生属于哪个班级;
is-a 是继承的关系; has-a是聚合的关系(aggreagation)
代码的开发原则: 优先使用聚合,然后是继承
子类和父类的调用顺序:
Dog dog = new Dog("旺财");
1. 给父类的属性赋值
2. 调用父类的构造方法进行初始化
3. 给子类的属性赋值
4. 调用子类的构造方法进行初始化
Dog dog = new Dog("旺财");
参数是从子类的构造中传入,接收参数的是父类的属性,super此处的作用就是参数的二传手
public Dog(String name) {
super(name);
}
this ---- 对象自身
Dog dog = new Dog("旺财");
dog对象,这个对象中包含两块内存(Pet + Dog),这两块内存都被称为对象自身
当父类Pet和子类Dog,都有name属性时,那么在dog中调用this.name指的是调用的Dog类型中的内存;
如果想调用Pet中的name,必须使用super.name;
正常编程时,没有这种使用场景。父类定义了name属性后,在子类无需再次定义该属性;
这种情况,在dog对象中this.name和super.name的效果是一样的;
Dog dog = new Dog("旺财");
System.out.println("dog name:" + dog.name); //此处调用的是子类的name
Pet pet = (Pet)dog; //dog引用和pet引用存储的地址是一样的
System.out.println("pet name:" + pet.name); //此处调用的是父类的name
强调: JAVA中的继承,是单线继承。 JAVA不允许多重继承;
C++中允许多重继承
子类可以继承父类的那些属性和方法:
1. 父类的private属性和方法,都不能继承
2. 父类的protected属性和方法,都可以继承
3. 父类的public属性和方法,都可以继承
4. 父类的默认关键字修饰的属性和方法,如果子类和父类在同一个包内,就可以继承;否则不行;
练习题:
1.父类的那些成员不能被子类继承??
Private成员
子类与父类不在同包,使用默认访问权限的成员
构造方法
2.继承后对象的初始化顺序:
父类属性、父类构造方法、子类属性、子类构造方法
3.关于构造器说法错误的是 b
A. 构造器不属于类成员方法,因此构造器不能被继承
B. 只有构造器才能拥有和类名相同的方法名
C. 一个类可以拥有多个重载的构造器
D. 在子类中调用父类的非默认构造器,必须使用super(...)语句,而且该语句必须位于子类构造器的第一行
4.当一个类的所有构造器均为私有的,以下哪个描述是正确的? c
A. 不能被其他类实例化
B. 不能被其他类继承
C. 既不能被其他类实例化,也不能被其他类继承
D. 该类必须被final修饰
5.关于类继承的说法,正确的是 b
A. Java 类允许多继承
B. Java接口允许多继承
C. 接口和类都允许多继承
D. 接口和类都不允许多继承
6. 对于内部类,以下说法错误的是 c
A. 匿名内部类可以实现接口或继承其他类,但不能同时即实现接口又继承类
B. 匿名内部类不能有任何明确的构造器
C. 内部类可以定义在外部类类体中,也可以定义在外部类的方法体中,和外部类不同,内部类均能使用访问修饰符,并能使用static修饰
D. 在Java中,对内部类的嵌套层次没有限制
7.以下关于abstract的说法,正确的是 d
A. abstract只能修饰类
B. abstract只能修饰方法
C. abstract类中必须有abstract方法
D. abstarct方法所在的类必须用abstract修饰