java设计⼀个⼈派⽣出学⽣类_JAVA学习周记(三)
1、继承
继承就是在已经存在的类的基础上再进⾏扩展,从⽽产⽣新的类。已经存在的类称为⽗类、超类或基类,⽽新产⽣的类称为⼦类或派⽣类。
学习java的学习方法继承所表达的就是对象类之间的相交关系,它使得某类对象可以继承另外⼀类对象的数据成员和成员⽅法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、⽗类或超类,⽽称继承类B为A的派⽣类或⼦类。
代码试例:汽车类{
汽车有四个轮⼦属性
引擎属性
⽅向盘属性
如何驾驶()      //⽅法函数
如何保养()      //⽅法函数
}
宝马⼚家的敞篷跑车继承汽车类
{
如何打开敞篷          //⽅法函数
}
继承的类型
继承可以分为单继承和多继承。单继承是指⼀个⼦类最多只能有⼀个⽗类。多继承是⼀个⼦类可以有俩个以上的⽗类。Java语⾔中的类只⽀持单继承,多继承是通过接⼝来间接实现的。
派⽣类
Java中类的继承是通过extends来修饰的,通过extends的关键字表明前者具备后者的公共的成员变量和⽅法,再具备了所有公共的成员变量和⽅法后,本⾝还能定义⼀些特有的成员变量和⽅法。基本语
法如下:
访问控制符  [修饰符]  class  类名  extends  ⽗类名{
.........
}
例题:定义⼀个学⽣类Student,继承⾃person类。
定义⽗类 person 如下:
public class person{
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(String age){
this.age=age;
}
public int getAge(){
return Age;
}
}
定义⼦类 Student 类如下:
public class Student extends Person{
private String school;
public void setSchool(String school){
this.school=school;
}
public String getSchool(){
return school;
}
public static void main(String[] args){
Student st=new student();
st.setName("奚佳欣");
st.setAge(20);
st.stSchool("西安欧亚学院");
systen.out.println("姓名:  "+st.getName()+"  年龄:  "+st.getAge()+"  学校:  "+st.getSchool());
}
}
以上程序中的Student类扩充了Person类,增加了学校的属性及对应的setter和getter⽅法,由于Person类中已经存在name和age俩个属性,也就是说此时student类中已经存在了3个属性及3组setter和getter⽅法,所以在Student类中不需要重新声明着俩个属性,这时就需要考虑是否可以将person类中的内容继续保留到Student类中,也就是继承。
使⽤super调⽤⽗类的构造⽅法
⼦类如果想使⽤⽗类的构造⽅法,必须在⼦类的构造⽅法中使⽤,并且必须使⽤关键字super来表⽰,⽽且super必须是⼦类构造⽅法中第⼀个语句。
例题:修改上个例题,分别加⼊带参数的构造函数
定义⽗类Person1类:
public class Peson1{
private String name;
private int age;
public Personq(String name ,int age){
this.name = name;
this.age = age;
System.out.println("我是"+this.name);
System.out.println("我的年龄是"+this.age);
}
}
定义⼦类Student1类:
public class student1 extends Person1{
private String school;
public Student(String name, int age,String school){
super("奚佳欣",20);
this.school = school;
system.out.println("我来⾃"+this.school);
}
public  static vold  main(String[] ages){
Students st=new Student1("奚佳欣",20,"西安欧亚学院");
}
}
super⽤法总结:
1.在⼦类构造⽅法中要调⽤⽗类的构造⽅法,⽤"super(参数列表)"的⽅式调⽤,参数不是必须的。同时还要注意的⼀点是:"super(参数列表)"这条语句只能⽤在字参数构造⽅法中的第⼀⾏。
2.当⼦类⽅法中的局部变量或者⼦类的成员变量与⽗类变量同名是,也就是⼦类局部变量⽗类成员变量事,⽤“super.成员变量名”来引⽤⽗类成员变量。当然,如果⽗类的成员变量没有被覆盖,也可以⽤“super.成员变量名”来引⽤⽗类成员变量,但这样是不必要的。
3.当⼦类的成员⽅法覆盖了⽗类的成员⽅法时,也就是⼦类和⽗类有完全相同的⽅法定义(但⽅法可以不同),此时,⽤“super.⽅法名(参数列表)”的⽅式访问⽗类的⽅法。
4.super关键字只能⽤在类体中⾮静态部分,如构造函数与成员⽅法中,若在main()函数中调⽤或⽤在静态⽅法中则会编译出错,报出Cannot use super in a static context 的错误。
泛型数组
1、Java的数组允许在运⾏时确定数组的⼤⼩,但要改变数组的⼤⼩就不容易了,解决办法是使⽤ArrayList类,它是⼀个采⽤类型参数的泛型类,如:ArrayList,尖括号⾥的是类名,表⽰这个数组列表类⾥存储的元素是Employee类的对象,如下声明⼀个保存Employee对象的数组列表:
ArrayList staff = new ArrayList();
2、操作数组列表
① 使⽤add⽅法可以将元素添加到数组列表中,如:staff.add(new Employee(“Tom”,...))会添加元素到末尾,如:staff.add(i, e)会添加元素到第i个位置,后⾯的元素向后移⼀位
② 使⽤remove⽅法删除⼀个元素,如:
ve(1) //表⽰删除标号为1的元素,并返回被删除的那个元素
ve(e) //其中e是⼀个对象的引⽤,如果在列表中到e对象,删除它并返回true,不到则返回false
③ 可以使⽤for each循环对数组列表遍历,如:for(Employee e : staff){...}
④ 如果已经清楚或能够估计出数组可能存储的元素数量,就可以在填充数组之前调⽤ensureCapacity⽅法,如:
—— 这个⽅法和数组的⼤⼩有很重要的区别:如果数组分配100个元素的存储空间,数组就有100个空位置可以使⽤,⽽容量为100个元素的数组列表只是拥有保存100个元素的潜⼒,在最初,甚⾄完成初始化构造之后,数组列表根本就不含有任何元素,此时 数组列表.size()等于0
⑤ size⽅法将返回数组列表中包含的实际元素数⽬,如:staff.size()
⑥ ⼀旦能够确定数组列表的⼤⼩不再发⽣改变,就可以调⽤trimToSize⽅法,这个⽅法将存储区域的⼤⼩调整为当前元素数量所需要的存储空间数⽬,垃圾回收器将回收多余的存储空间
—— ⼀旦整理了数组列表的⼤⼩,添加新元素就需要花时间再次移动存储块,所以应该在确认不会再添加任何元素时再调⽤trimToSize
⑦ 对于数组列表变量,如a和b,对于语句:a = b,表⽰让a和b引⽤同⼀个数组列表,并没有发⽣列表⾥元素的复制,这点和C++不同
3、访问数组列表元素
① 要设置第i个元素(注:数组列表的下标从0开始),可以:staff.set(i, harry)
—— 只有i⼩于数组列表⼤⼩时才能调⽤list.set(i,x),例如初始化了⼀个有存储100个元素潜⼒的数组列表,此时它的⼤⼩为0,所以
list.set(0, x)这句是错误的,应使⽤add⽅法为数组列表添加新元素,⽽不要使⽤set⽅法,它只负责替换数组中已经存在的元素内容
② 要获得第i个元素,可以:(i)
③ 想要像数组那样访问数组列表元素,可以使⽤toArray⽅法将数组列表元素拷贝到⼀个数组中:Array(a)
对象包装器与⾃动打包
1、Java为所有的基本类型提供了相对应的类,称为包装器(Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean(前六个派⽣于公共的超类Number)),包装器是不可变的,不允许更改包装在其中的值,包装器还是final的,因此不能定义它们的⼦类,如对于数组列表,这样写是不允许的:ArrayList,需要写成:ArrayList list = new ArrayList()
— ArrayList的效率远远低于int[]数组,所以此时数组列表更适合构造⼩型集合,因为这样操作起来更⽅便
2、⾃动打包
① 如果把int变量赋给Integer对象,Java会⾃动打包,如:list.add(3) 会⾃动换成 list.add(new Integer(3))
② 如果把⼀个Integer对象赋给int值时,会⾃动拆包,如:Integer n = 3; n++;等会⾃动拆开对象包,然后进⾏计算,最后将结果存⼊对象包内
—— 注意应避免使⽤ == 符合来判断两个包装器对象是否相等,因为这有可能是检测的是对象是否指向同⼀个存储区域,应该使⽤equals ⽅法来进⾏⽐较
—— 打包和拆包是编译器认可的,⽽不是虚拟机
参数数量可变的⽅法
使⽤“...”符号来定义可变参数,如printf⽅法的定义是:public PrintStream printf(String fmt, args){ },⽤户⾃⼰也可以定义可变参数⽅法,并将参数指定为任意类型,甚⾄是基本类型,如下⾯的代码计算若⼲个数值的最⼤值:
public static double values){
double largest = Double.MIN_VALUE;
for(double v : values)
if(v > largest) largest = v;
return largest;
}
—— 注意,虽然“...”符号在运⾏程序时类似于把参数变为数组,但并不等价
① 如上⾯的max⽅法的参数是“double[] d”,那么在调⽤max⽅法应该这样:double d = new double[]{1.0, 2.0}; max(d);或者
max(new double[]{1.0, 2.2, 4,3});
② 如果max的参数是“ values”,那么调⽤max⽅法应该这样:max(1.2, 1.3, 2.3);
枚举类
枚举类型(enum type)是指由⼀组固定的常量组成合法的类型。Java中由关键字enum来定义⼀个枚举类型。下⾯就是java枚举类型的定义。
publicenumSeason {
SPRING, SUMMER, AUTUMN, WINER;
}
特点
Java定义枚举类型的语句很简约。它有以下特点:
1) 使⽤关键字enum 2) 类型名称,⽐如这⾥的Season 3) ⼀串允许的值,⽐如上⾯定义的春夏秋冬四季 4) 枚举可以单独定义在⼀个⽂件中,也可以嵌在其它Java类中。
除了这样的基本要求外,⽤户还有⼀些其他选择
5) 枚举可以实现⼀个或多个接⼝(Interface) 6) 可以定义新的变量 7) 可以定义新的⽅法 8) 可以定义根据具体枚举值⽽相异的类
⽤法
常量
switch
向枚举中添加新⽅法
覆盖枚举的⽅法
实现接⼝
使⽤接⼝组织枚举
反射
在运⾏状态中,对于任意⼀个类,都能够获取到这个类的所有属性和⽅法,对于任意⼀个对象,都能够调⽤它的任意⼀个⽅法和属性(包括私有的⽅法和属性),这种动态获取的信息以及动态调⽤对象的⽅法的功能就称为java语⾔的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。