(一)访问权限
1.私有变量 私有方法 (包括实例和静态):若 B 类创建 A 类的对象后(包括用new 和 不用new ), B 类不可直接访问 A 私有变量,
私有方法( "."运算符访问实例变量,实例方法,类变量(警告),类方法(警告),类名访问类变量,类方法).
2.共有变量 共有方法(包括静态和实例):任何类都可以访问共有变量 共有方法
3.友好变量 友好方法(包括静态和实例):B 类创建了 A 类的对象后,若在同一个包中,那么该对象可以访问自己的友好变量,友好
方法。
4.保护变量 保护方法(包括静态和实例):B 类创建了 A 类的对象后,若在同一个包中,那么该对象可以访问自己的保护变量,保护
方法。
5.B 类与 A 类不再同一个包中,B 类使用 A类变量或方法(包括静态和实例):
(1)导入包 名称与源文件中其他类名不可重复 且A类是public
(2)创建对象
(3)A类的变量 方法也是public (包括静态和实例)
(二)继承
1.子类和父类在同一包中的继承性:除private的变量和方法(包括静态和实例),访问权限保持不变。
2.子类和父类不在同一包中的继承性:除private,友好的变量和方法(包括静态和实例),访问权限保持不变。
3.继承的方法可以操作未继承的变量和方法
4.继承的前提是可视
(1)在同一包中 父类可以为public和友好的 子类构造函数不可是 private
(2)不同包中 父类可以为public 子类构造函数不可是 private和友好的,先调用父类构造函数 在调用子类构造函数
5.protected 进一步说明:
在 B 类中用 A 类创建对象,该对象访问protected变量和方法权限如下:
(1)对于子类A自己声明的protected成员变量和方法,只要A类和B类在同一个包内,对象就可以访问这些protected方法和变量
(2)对于子类A从父类继承的protected成员变量和方法,需要追溯到这些protected所在的祖先类,若祖先类与B在同一个包中,就可以访问,否则不可访问。
(三)方法重写和重载,成员变量的隐藏
重写:如果子类可以继承父类的某个方法,那么字类就有权利重写这个方法,不属于新增的方法.方法重写是指:子类中定义一个方法,方法类型和父类的方法类型一致,或是父类的方法类型的子类型(jdk1.5后允许 所谓子类型是指,如果父类的方法类型师”类”,那么允许字类的重写方法的类型是”子类”),并且这个方法的名字,参数个数,参数类型和父类的方法完全相同.
重写的方法既可以操作继承的成员变量,调用继承的方法,也可以操作子类型声明的成员变量,调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法.若要使用子类隐藏的成员变量和方法时,使用关键字super.子类新增或重写提高方法无法调用未继承的成员变量和方法,子类继承的方法可以调用。
重写父类的方法时,不允许降低方法的访问权限,但可以访问权限(从高到低排序是public protected 友好的 private)
重载:一个类中可以有多个方法具有相同的名字,但参数不同,满足:
(1) 参数个数不同
(2) 参数个数相同,但参数列表中对应得参数类型不同。
(3) 方法的返回类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使返回类型不同,也必须保证参数不同。
成员变量的隐藏:子类所声明的成员变量的名字和从父类继承来的成员变量的名字相同
(类型可以不同),在这种情况下,子类 会隐藏所继承的成员变量。
(1) 子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
(2) 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。
(四) super
子类一旦隐藏了继承的成员变量和方法,那么子类创建的对象就不再拥有该变量和方法,该变量和方法将归关键字super所有。
当用子类的构造方法创建一个对象时,子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有明显的指名使用父类的哪个构造方法,那么子类就调用父类的不带参数的构造方法。如果类里定义了一个或多个构造方法,那么java不提供默认的构造方法,这会出现错误,因此当父类中定义多个构造方法时,应当包含一个不带参数的构造方法。
由于子类不继承父类的构造方法,因此,子类在构造方法中需使用super调用父类构造方法,而且super必须是子类构造方法中的第一条语句。
(五)final
Final 类:不能被继承。如java.lang包中提供的String类。
Final 方法:不允许子类重写
Final 常量:成员变量或局部变量,在运行期间不可以再发生变化。
(六)static
1.静态对象可访问静态或实例变量和方法
2.静态方法中不可使用实例的变量和方法,不可以声明静态变量(为什么)
3.实例方法中可适用静态的变量和方法
(七)上转型对象
用子类创建一个对象,并把这个对象的引用放到父类的对象中时,称此对象为上转型对象。上转型对象也可以在强制转换得到一个子类对象,这样该子类对象又具备了子类所有的属性和功能。反之,将父类创建的对象的引用放到子类的对象中是不可以的(不能说“人是美国人”)
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能(好比说老虎是动物时,老虎将失掉老虎独有的属性和功能):
(1) 上转型对象不可以操作子类新增的成员变量和方法
(2) 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法,当子类重写了父类的某个实例方法后,对象的上转型对象调用这个实例方法一定使用了子类重写的实例方法。(构成多态)。如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类的静态方法,只能调用父类的静态方法。
Class Animal{
Void cry(){}
}
Class Dog extends Animal{
Void cry(){
System.out.println(“汪汪... ...”);
}
}
Class Cat extends Animal{
Void cry(){
System.out.println(“喵喵... ...”);
}
}
Public class Exc1{
Public static void main(String args[]){
Animal a;
a=new Dot();
a.cry();
a=new Cat();
a.cry();
}
}
(八)abstract
(1)abstract类可以有abstract方法也可以 有非abstract方法
(2)abstract方法,只允许声明,不允许实现(没有方法体),不允许使用final 和 abstract同时修饰一个方法或类,也不允许使用static修饰abstract方法。
(3)abstract类不能使用new运算符创建该类的对象,如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不允许用final修饰抽象类的原因。