[零基础学JAVA]Java SE面向对象部分-14.面向对象高级(02)

简介:
本季先重点回顾了方法的重载与覆写、super与this关键字的区别。之后主要以实例讲解为主,主要回顾了JAVA中的继承及数组的基本概念,之后又讲解了JAVA中继承的图形表示。
上季内容回顾:
1、继承的使用和概念,继承的各种限制 
2、子类对象的实例化过程 
3、方法覆写 
4、super的使用 
有两个题目在面试中经常会涉及到哈~~~
面试一:解释一下方法的覆写与方法的重载的区别:
面试二:super与this的区别

属性覆写 (较少使用)
我们来简单验证下哈
class A    
{    
        String name =  "redking";    
};    
class B  extends A    
{    
         //子类定义了一个和父类中相同的name属性    
        String name =  "Michael";    
         public  void print()    
        {    
                 //与System.out.println(this.name);效果相同    
                System.out.println(name);    
        }    
};    
public  class Demo01    
{    
         public  static  void main(String args[])    
        {    
                B b =  new B();    
                b.print();    
        }    
};
程序打印了在子类中定义的name属性:Michael
image
如果要打印父类中的name属性,我们可以修改成super.name
class A    
{    
        String name =  "redking";    
};    
class B  extends A    
{    
         //子类定义了一个和父类中相同的name属性    
        String name =  "Michael";    
         public  void print()    
        {    
                 //与System.out.println(this.name);效果相同    
                System.out.println(name);    
                 //如果要打印父类中的name属性,我们可以修改成super.name    
                System.out.println( super.name);    
        }    
};    
public  class Demo01    
{    
         public  static  void main(String args[])    
        {    
                B b =  new B();    
                b.print();    
        }    
};
父类中的name属性输出了哈~这就叫属性的复写
image
属性一般情况下都要求被封装的,被封装之后肯定子类是无法看见父类中的内容,所以根本就无法覆写。 
super与this调用构造方法能同时写在一个构造方法之中吗?答案是不行哈~ 
Super调用构造方法时,一定要放在构造方法的首行,this调用构造方法时也必须放在首行,如果两个都放在首行,则肯定冲突。
有人认为可以不调用super方法哈,我们看下面的Demo02
class A    
{    
         public A(){}    
};    
class B  extends A    
{    
         //里面有三个构造方法    
         public B()    
        {    
                 this( "abc",888);    
        }    
         public B(String name)    
        {    
                 this();    
        }    
         public B(String name, int age)    
        {    
                 this(name);    
        }    
}; 

这样就产生了一个问题,我们在讲this关键字时也是提到过的哈~
image
在使用this()调用构造方法的时候肯定要留下一个出口。否则编译通不过哈~
class A    
{    
         public A(){}    
};    
class B  extends A    
{    
         //里面有三个构造方法    
         public B()    
        {    
                 //最好把this("abc",888);修改成super()作为出口哈~    
                 super();    
        }    
         public B(String name)    
        {    
                 this();    
        }    
         public B(String name, int age)    
        {    
                 this(name);    
        }    
}; 

现在编译就通过了哈~
image
本季主要知识点:
1、继承的类图表示 
2、继承的题目
现在我们来看个Demo03:
class A    
{    
};    
class B  extends A    
{    
}; 

这个滴继承关系我们来用类图表示
image
知道了上面的内容,我们来看下练习题:
image
class Person    
{    
         private String name;    
         private String addr;    
         private  char sex;    
         private  int age;    
         //一般参数少的构造方法写在上面哈~~    
         public Person(){}    
         public Person(String name,String addr)    
        {    
                 this.setName(name);    
                 this.setAddr(addr);    
                 this.setSex('男');    
                 this.setAge(27);    
        }    
         public Person(String name,String addr, char sex, int age)    
        {    
                 this.setName(name);    
                 this.setAddr(addr);    
                 this.setSex(sex);    
                 this.setAge(age);    
        }    
         public  void setName(String name)    
        {    
                 this.name = name;    
        }    
         public  void setAddr(String addr)    
        {    
                 this.addr = addr;    
        }    
         //M:表示男;F:表示女    
         public  void setSex( char sex)    
        {    
                 this.sex = sex;    
        }    
         public  void setAge( int age)    
        {    
                 this.age = age;    
        }    
         public String getName()    
        {    
                 return  this.name;    
        }    
         public String getAddr()    
        {    
                 return  this.addr;    
        }    
         public  char getSex()    
        {    
                 return  this.sex;    
        }    
         public  int getAge()    
        {    
                 return  this.age;    
        }    
         //所有的内容应该交给外部输出    
         public String getInfo()    
        {    
                 return  "姓名:"+ this.name    
                        + ",地址:"+ this.addr    
                        + ",性别:"+( this.sex=='M'? "男": "女")    
                        + ",年龄:"+ this.age;    
        }    
};    
class Student  extends Person    
{    
         private  float math;    
         private  float english;    
         public Student()    
        {    
                 //默认隐含了super();    
                 super();    
        }    
         public Student(String name,String addr)    
        {    
                 super(name,addr);    
        }    
         public Student(String name,String addr, char sex, int age, float math, float english)    
        {    
                 super(name,addr,sex,age);    
                 this.setMath(math);    
                 this.setEnglish(english);    
        }    
         public  void setMath( float math)    
        {    
                 this.math = math;    
        }    
         public  void setEnglish( float english)    
        {    
                 this.english = english;    
        }    
         public  float getMath()    
        {    
                 return  this.math;    
        }    
         public  float getEnglish()    
        {    
                 return  this.english;    
        }    
         public String getInfo()    
        {    
                 return  super.getInfo()+ ",数学成绩:"+ this.math+ ",英语成绩:"+ this.english;    
        }    
};    
public  class Demo04    
{    
         public  static  void main(String args[])    
        {    
                 //使用学生类    
                Student stu =  new Student( "王乾", "无锡",'M',27,98.0f,99.0f);    
                System.out.println(stu.getInfo());    
        }    
}; 

image
现在我们将其导入类图哈~
image
下面再来看一个练习题哈~
image
      Java中在声明数组长度的时候可以给一个变量,变量的内容可以在程序运行时自动决定。
//声明数组类    
class Array    
{    
         //设置整型数组    
         private  int i[] =  null;    
         //设置一个脚标表示插入的点位置    
         private  int foot = 0;    
         //在构造方法处写入数组的大小    
         public Array( int len)    
        {    
                 this.i =  new  int[len];    
        }    
         //输入数据时必须保证数组里有空间接收此数据    
         public  boolean add( int temp)    
        {    
                 //先判断是否数组中已经加满了内容    
                 if ( this.foot< this.i.length)    
                {    
                         //表示数组里面依然有空间可以插入数据    
                         this.i[ this.foot] = temp;    
                         //修改脚标    
                         this.foot++;    
                         return  true;    
                }    
                 else    
                {    
                         return  false;    
                }    
        }    
         //理解为得到全部的数组内容    
         public  int[] getAll()    
        {    
                 return  this.i;    
        }    
};    
//定义排序的子类    
class SortArray  extends Array    
{    
         //排序类是Array类的子类,所以此处必须传入一个大小    
         public SortArray( int len)    
        {    
                 super(len);    
        }    
         //得到的是一个排序后的数组    
         //最好复写getAll()方法    
         public  int[] getAll()    
        {    
                 //但是此方法返回的是一个排序好的数组    
                 //采用由低到高的方式排序    
                 for ( int i=0;i< super.getAll().length ;i++ )    
                {    
                         for ( int j=0;j< super.getAll().length-1 ;j++ )    
                        {    
                                 if ( super.getAll()[i]< super.getAll()[j])    
                                {    
                                         //两个数字相换    
                                         int t =  super.getAll()[i];    
                                         super.getAll()[i]= super.getAll()[j];    
                                         super.getAll()[j]=t;    
                                }    
                        }    
                }    
                 return  super.getAll();    
        }    
};    
class ReverseArray  extends Array    
{    
         public ReverseArray( int len)    
        {    
                 super(len);    
        }    
         public  int[] getAll()    
        {    
                 //反转指的是与插入的顺序相反即可    
                 int temp[] =  new  int[ super.getAll().length];    
                 //定义一个temp脚标的变量    
                 int cou = 0;    
                 for ( int i= super.getAll().length-1;i>=0 ;i-- )    
                {    
                        temp[cou] =  super.getAll()[i];    
                        cou++;    
                }    
                 return temp;    
        }    
}    
public  class Demo05    
{    
         public  static  void main(String args[])    
        {    
                SortArray sa =  new SortArray(8);    
                sa.add(15);    
                sa.add(22);    
                sa.add(07);    
                sa.add(82);    
                sa.add(75);    
                sa.add(99);    
                sa.add(27);    
                sa.add(89);    
                print(sa.getAll());    
                System.out.println( "\n"+ "**********排序类与反转类分割线哈~~~**********");    
                ReverseArray ra =  new ReverseArray(8);    
                ra.add(15);    
                ra.add(22);    
                ra.add(07);    
                ra.add(82);    
                ra.add(75);    
                ra.add(99);    
                ra.add(27);    
                ra.add(89);    
                print(ra.getAll());    
        }    
         public  static  void print( int temp[])    
        {    
                 for ( int i=0;i<temp.length ;i++ )    
                {    
                        System.out.print(temp[i]+ "\t");    
                }    
        }    
};    

看下效果:
image 
类图如下:
总结 
巩固了继承的概念,继承到底继承了那些东西,super的使用,方法的覆写
#######################################################################








本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/125955 ,如需转载请自行联系原作者
相关文章
|
8天前
|
存储 安全 Java
Java面向对象最新超详细总结版!
Java面向对象最新超详细总结版!
25 7
Java面向对象最新超详细总结版!
|
2天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
4天前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
17 3
|
4天前
|
SQL Java 编译器
java面向对象——包+继承+多态(一)-1
java面向对象——包+继承+多态(一)
16 2
|
14天前
|
存储 Java 开发工具
【Java探索之旅】用面向对象的思维构建程序世界
【Java探索之旅】用面向对象的思维构建程序世界
11 0
|
14天前
|
Java
java使用面向对象实现图书管理系统
java使用面向对象实现图书管理系统
|
15天前
|
Java
Java语言---面向对象的三大特征之继承
Java语言---面向对象的三大特征之继承
|
15天前
|
机器学习/深度学习 Java Python
Java面向对象知识体系---基础版
Java面向对象知识体系---基础版
|
15天前
|
Java 索引
Java SE ____二维数组
Java SE ____二维数组
|
19天前
|
安全 Java
Java基础&面向对象&继承&抽象类
Java基础&面向对象&继承&抽象类