一.域的隐藏
- d.x 子类对象d的域x的值,,子类的同名域值
class Base{
int x=3;
public void m(){
x++;
System.out.println("base 的x值为:"+x);
}
}
class Derived extends Base{
double x=20;
public void n(){
x--;
System.out.println("derived的x值为:"+x);
}
}
public class TestFieldHide {
public static void main(String[] args){
Derived d=new Derived();
System.out.println("derived对象的域x的值为:"+d.x);
}
}
class Base{
int x=3;
public void m(){
x++;
System.out.println("base 的x值为:"+x);
}
}
class Derived extends Base{
double x=20;
public void n(){
x--;
System.out.println("derived的x值为:"+x);
}
}
public class TestFieldHide {
public static void main(String[] args){
Derived d=new Derived();
System.out.println("derived对象的域x的值为:"+d.x);
}
}
2.
- d.m() d.n()一个是子类继承自父类的变量,一个是子类自己定义的变量。这两个成员变量名称相同,但是代表完全不同的变量。
当执行子类从父类继承的方法时,方法内处理的是 继承自父类的变量;
当执行子类定义的方法时,方法内处理的是自己的成员变量。
class Base{
int x=3;
public void m(){
System.out.println("Base 的x值为:"+x);
}
}
class Derived extends Base{
double x=20;
public void n(){
System.out.println("Derived的x值为:"+x);
}
public void getHideX()
{ System.out.println(" 父类中的域x值为:"+(super.x)); }
}
public class TestFieldHide1 {
public static void main(String[]args){
Derived d=new Derived();
d.m();
d.n();
d.getHideX();
}
}
二.方法的覆盖
1.子类在继承超类定义的同时,可以重新修改超类中原有定义的属性和方法,,通过子类的对象调用这个同名的方法时,只能使用新的方法(子类的同名方法)
class A{
int x=3;
public void m(){
System.out.println("the x of A is"+x); }
}
class B extends A{
double y=20.67;
public void m(){ // 同名方法 返回值类型 相同
y--;
x--; //x为类A中定义的域,可以被子类B的方法 直接操作
System.out.println("y="+y+" ,x="+x);
}
}
public class C {
public static void main(String[] args){
B b=new B();
b.m(); // 子类自己定义的方法
}
}
2.在子类的 方法中使用super .m(),,使用父类的同名方法
class A{
int x=3;
public void m(){
System.out.println("the x of A is"+x);
}
}
class B extends A{
double y=20.67;
public void m(){
y--;
x--;
System.out.println("y="+y+" ,x="+x);
super.m(); //子类的方法中,使用父类的同名方法
}
}
public class C {
public static void main(String[] args){
B b=new B();
b.m();
}
}
3.同名的方法 方法名相同 参数表相同 但是方法的 返回值类型不同==编译错误
class A{
int x=3;
public void m(){
System.out.println("the x of A is"+x);
}
}
class B extends A{
double y=20.67;
public double m(){
y--;
x--;
System.out.println("y="+y+" ,x="+x);
return y;
}
}
public class C {
public static void main(String[] args){
B b=new B();
b.m();
}
}
4.访问权限
方法的访问范围,可以不变、扩大,不可缩小。
class A{
int x=3;
public void m(){
System.out.println("the x of A is"+x);
}
}
class B extends A{
double y=20.67;
void m(){
y--;
x--;
System.out.println("y="+y+" ,x="+x);
}
}
public class C {
public static void main(String[] args){
B b=new B();
b.m();
}
}
5.方法的重载
如果1方法名相同,3参数表不同==这两个方法是不同的方法 方法的重载
(一)
class A{
int x=3;
public void m(){
System.out.println("the x of A is"+x);
}
}
class B extends A{
double y=20.67;
public void m(int a){
y--;
x--;
System.out.println("y="+y+" ,x="+x);
}
}
public class C {
public static void main(String[] args){
B b=new B();
b.m(); // 使用 继承自父类的方法
}
}
(二)
三,对象的类型转换
1.类作为一种 引用数据类型。类的对象===基本数据类型的 变量,,,不同类中 也存在 对象和对象之间的 类型转换问题。
2.只能在具有继承关系的 父类 子类对象之间进行
3.a.向上类型转换(直接): 父类类型 对象=子类对象
子类对象 转换为父类类型,即 特殊类型 到通用类型
b.向下类型转换(强制): 子类对象=(子类)父类对象
- 子类—>父类 削弱了子类的功能(域和方法)
public class Human {
String name;
int age;
char sex;
public Human(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
int getAge(){ return age; }
}
public class Worker extends Human {
double salary;
Worker(String name,int age,char sex,double salary){
super(name,age,sex);
this.salary=salary;
}
void addSalary(double sum){ salary+=sum;}
}
public class TestCasting {
public static void main(String[]args){
Worker a=new Worker("Mary",20,'女',100000);
Human h=a;
System.out.println(h.name+" "+h.age+" "+h.sex+" ");
}
}
2.
public class TestCasting {
public static void main(String[]args){
Human h=new Worker("Mary",20,'女',100000); //创建子类对象
父类对象=子类对象初始化
Worker a=(Worker)h; //强制转换 子类对象=(子类型)父类对象
System.out.println(a.name+" "+a.age+" "+a.sex+" "+a.salary);
}
}
5555555