第二次博客作业(4-6题目集)

                     前言

通过这接下来的三次题目及来看,应该说是由难到易,考察的知识点也是最近新学的,比如继承与多态,抽象的类与接口,还考了几道关于正则表达式的用法的题,老师的目的也很明确,就是让我们复习巩固之前所学的内容,题量并不大,而是非常基础,我觉得这样的效果更好,能够增加学生们的自信心,毕竟才刚学,没必要整的太过高深,这样的效果反倒更好。

            设计与分析

1)我们先来分析这两道类似的题目,根据它们的类图我们不难看出

 

 

 

 

 

 

一个是通过主函数main,分别再去设计几个类,由dateutil类来调用day,day类再来调用month,month再year;而另一个则是从dateutil直接分出三个分别为year,month,day的类,它们之间并不相互影响。

因为聚合可以维护代码的可重用性,打个比方,为了让学生、学院地址和工作人员都具有地址,现在,我们不需要一次又一次地使用相同的代码;我们只需要在定义每个类时引用Address类就行。

 

 

 

可以看出我的复杂度有些偏高了,仍需要改进。

因此,我们可以通过使用聚合关系来提高代码的可重用性。

相比较而言,第二个更能体现出代码的可重用性。

(2)从题目集四的7-3来看,运用的便是继承等方面的知识,继承和习惯性说法不同,子类并不是父类的一个子集,而且一个子类通常比它的父类包含更多的信息和方法。父类中的私有数据域在该类之外是不可访问的。所以我们便知道不能在子类中直接使用。但是,如果父类中定义了公共的访问器,那么可以通过这些公共发的访问器访问他们。也并不是所有的is-a关系都用继承来建模。继承是用来“是一种”关系建模的。不要仅,仅为了重用方法这个原因而盲目的继用特性。因此,一个父类和它的子类之间必须存在“是一种”关系。Java中是不允许多重继承的。一个Java类只可能直接继承一个父类。也称单一继承。

 

 

 

 

 

 

题目集六的5,6题,考察的是对多态还有接口方面的问题,多态意味着父类型的变量可以引用子类型的对象,多态是同一个行为具有多个不同表现形式或形态的能力多态就是同一个接口,使用不同的实例而执行不同操作。   

多态的转型分为向上转型和向下转型两种

向上转型:多态本身就是向上转型过的过程

 使用格式如下

父类类型 变量名=new 子类类型();

 

当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型

 使用格式如下

子类类型 变量名=(子类类型) 父类类型的变量;当要使用子类特有功能时使用

显而易见,这两道题用的就是这种方法。

 

 

 

这里的复杂度还是有点高,仍需要改进

 

接口在许多方面和抽象类很相似,但目的都是指明相关或者不相关类的对象的共同行为。使用了适当的接口,可以知名这些对象是可以比较的,可克隆的。

(3)关于正则表达式的用法,网络上有非常多的教学,我领略了不少,其中就包括如下(验证输入的Emailqq等,)

public static void main(String[] args) {

  // 要验证的字符串

 String str = "service@xsoftlab.net";

    // 邮箱验证规则

    String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";

    // 编译正则表达式

    Pattern pattern = Pattern.compile(regEx);

    // 忽略大小写的写法

    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(str);

    // 字符串是否与正则表达式相匹配

    boolean rs = matcher.matches();

    System.out.println(rs);

}

 

 

 

 

 

 

 

 

 

 

包括验证码等等的校验

 

 

在字符串中查询字符或字符串

public static void main(String[] args) {

    // 要验证的字符串

    String str = "baike.xsoftlab.net";

    // 正则表达式规则

    String regEx = "baike.*";

    // 编译正则表达式

    Pattern pattern = Pattern.compile(regEx);

    // 忽略大小写的写法

    // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(str);

    // 查找字符串中是否有匹配正则表达式的字符/字符串

    boolean rs = matcher.find();

    System.out.println(rs);

}

正则表达式是一种文本模式,包括普通字符(例如,a z 之间的字母)和特殊字符(称为元字符)。模式描述在搜索文本时要匹配的一个或多个字符串。

Java的正则表达式有判断,分割和替换等功能。

public boolean matches(String regex)

public String[] split(String regex)

public String replaceAll(String regex,String replacement)

(4)针对题目集五(7-4)的结构分析,我们首先知道关键字包括如下

 

 

 

 在这里的基础上,运用了正则表达式的查找方法

          

 

 

从中筛选出符合要求的字符串及关键字

 

 

 

再通过筛选,将注释中和字符串中的的关键字排除在外,筛选出符合条件的关键字并输出。

 

 

 

                采坑心得

首先我想要说的便是正则表达式,正则表达式的掌握和运用对我们来说,非常重要。正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。它可以进行验证查找和替换的基本操作,例如我们进行qq号校验

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Main {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner cy=new Scanner(System.in);

String qq =cy.nextLine();

String regex = "[1-9][0-9]{4,14}";//第一位1-9之间的数字,第二位0-9之间的数字,数字范围4-14个之间

boolean flag = qq.matches(regex);

if(flag) {

System.out.print("你输入的QQ号验证成功");

}else {

System.out.print("你输入的QQ号验证失败");

 

}

 

}

}

 

 

String regex="(2020)((1[1-7])|(7[1-3])|(8[1-2]))(([0][1-9])|([1-3][0-9])|(40))";//还有这里,我之前一直写,却总是报错,原因如下,一是因为题意理解的不正确,二是正则表达式的使用还是不熟练导致了半天也没有更改成功。所以要切记要多加练习,方可立于不败之地。

 

最近学习的继承与多态,静态方法只有在可访问时才能重写。如果父类中定义的静态方法在子类中重新定义,那么父类中的定义方法将被隐藏。

Java中的每个类都继承自java.lang.Object类。如果一个类在定义时没有指定继承关系,那么它的父类就是Object

如果一个方法的参数类型是父类,而一向该方法的参数传递任何子类的对象,这便是我对多态的理解。

一个类定义一个类型。子类定义为子类型,父类定义为父类型。

像题目集四的第三题,运用的就是这一方面的知识。

  class Shape{    

public Shape(){

       System.out.println("Constructing Shape");

}

public double getArea(){

   return 0.0;

}

}

 

class Circle extends Shape{

public Circle(){

       System.out.println("Constructing Circle");

}

 

private double radius;

public void setRadius(double radius){

this.radius = radius;

}

 

public double getRadius() {

return radius;

}

 

@Override

public double getArea() {

// TODO Auto-generated method stub

return Math.PI*radius*radius;

}

 

}

    class Rectangle extends Shape{

public Rectangle() {

       System.out.println("Constructing Rectangle");

}

private double length;

private double width;

 

public void setLength(double length) {

this.length = length;

}

public double getLength(){

return length;

}

 

public void setWidth(double width){

this.width = width;

}

 

public double getWidth(){

return width;

}

@Override

public double getArea() {

// TODO Auto-generated method stub

return length*width;

}

 

}

class Ball extends Circle{

public Ball(){

       System.out.println("Constructing Ball");

}

 

@Override

public double getArea(){

// TODO Auto-generated method stub

return 4.0*super.getArea();

}

public double getVolume(){

double r1=getRadius();

return 4.0/3.0*Math.PI*r1*r1*r1;

}

 

}

 

class Box extends Rectangle{

public Box(){

       System.out.println("Constructing Box");

}

private double height;

public double getHeight(){

return height;

}

public void setHeight(double height){

this.height = height;

}

public double getVolume(){

return height*super.getArea();

}

@Override

public double getArea(){

// TODO Auto-generated method stub

double length2=getLength();

double width2=getWidth();

 

return (length2*width2+width2*height+length2*height)*2;

}

 

 

}

这里就充分体现了继承这一特性。可以使用final修饰符来表明一个类是最终类,是不能被继承的,也可以表明一个方法是最终的,是不能被重写的。

 

我们再说说多态,多态意味着父类型的变量可以引用自类型的对象。我们创建一个角色为父类对象的引用而指向子类,那么该角色拥有父类,也就是拥有所有属性和行为,同时它有该角色自己的行为即函数方法(简单来说就是技能技能)。多态的优势就体现出来了,当我们需要创建大量的类时,他们可能都有基类里通用的函数方法,但是每个角色又不尽相同,那么不同之处我们就可以用多态来实现解决,既节省了大量代码和时间,同时又符合面向对象的思想。这就是我在学习过程中对多态的理解,举个例子

Public class PolymorphismDemo{

public static void main(String[] args){
// Display circle and rectangle properties
displayObject(new Circle(1, "red”, false));
display0bject(new Rectangle(1, 1, "black", true));
/*Display geometric object properties */
public static void disp1ay0bject(GeometricObject object){

System.out.print1n(“Created on” + object.getDateCreated()+”. Color is "+ object.getColor());

}

}

这里displayObject具有GeometricObject类型的参数。可以通过传递任何一个GeometricObject 的实例  。我们在new Circle和new Rectangle来调用displayObject。使用父类对象的地方都可以使用子类的对象。

有的时候,我们要防止继承和重写,在在这种情况下,使用final修饰符表明一个类是最终类,是不能作为父类的。我们知道Math类就是一个最终类。像String.StringBuilder和StringBuffer类以及所有基本数据类型的包装类也都是最终类。

但是我们一定要注意的是修饰符 public、protected、private、static、abstract以及final可以用在类
和类的成员(数据和方法)上,只有final修饰符还可以用在方法中的局部变量上。方法内的局部变量就是常量。

例如

Public class Test{

Public final void m(){

}

}

这些便是我觉得需要注意的地方。

    改进建议

在题目集六的倒数第二道题中,在探究三角形属性非法这一点,我觉得我用的方法就不是很好。我在网上看到的方法就非常好,巧妙的运用数组排序来解决,我就觉得比我的要简单并且要高大上许多,看截图如下

 

 

 

 

 

 

 

显而易见,我用的是简单粗暴一点,用了最通俗易懂的if语句,但是用他们的话,圈复杂度会非常的高,然而如果用第二个图的方法的话,就会方便精妙很多。所以给我的一点提示就是要尽量少用或不用if。我觉得这边是我所需要提高的地方。

 

 

 

 

 

                  总结

对本阶段三次题目集的综合性总结,学到了封装,继承,多态和接口等方面相关的知识,也复习了一下正则表达式。可以从现有的类定义新的类,这称为类的继承。新类称为子类或继承类,现有的类称为超类、父类或基类。
又知道构造方法用来构造类的实例。不同于属性和方法,子类不会继承父类的构造方法。它们只能用关键字super从子类的构造方法中调用。
构造方法可以调用重载的构造方法或其父类的构造方法。这种调用必须是构造方法的第一条语句。如果没有显式地调用它们中的任何一个,编译器就会把super()作为构造方法的第一条语句,它调用的是父类的无参构造方法。
如果你想为了重写一个方法,必须使用与它的父类中的方法一样的签名、一样或者兼容的返回类型来定义子类中的方法。

在多态中,子类可以调用父类中的所有方法。

多态主要体现为重载和重写。

相同的行为不同的实现方式。多态主要应用为多态参数和多态集合

在最后一次题目集的最后一题使用的便是接口,接口可以看作是抽象类的特例。抽象类有抽象方法,也有具体方法,但接口只能有抽象方法,不能有具体方法。

接口与抽象类的区别就是抽象类需要被继承,而且只能单继承 接口需要被实现,而且可以多实现但是我所了解的也仅仅只是皮毛而已,要想完全理解透彻,我们还需要去不断地学习和不断的练习,正所谓熟能生巧,愿意多花出时间和精力,就能收获不一样的理解。但是我对数组和Array list之间的异同还是不太明确,对列表的创建非常生疏,希望自己可以多加练习,把它掌握于心。Java是一门非常难的学科,希望自己可以努力攻克拿下它。

对于教师的意见就是我觉得老师应该多多和学生互动,这样可以调动学生们的积极心,也防止会出现课上无活力氛围的感觉,还有就是我觉得老师应该多多休息,我觉得老师真的挺忙的,有的时候竟然还要工作到凌晨2点,就希望老师能多多注意休息吧。

对于老师的教学方式,我很满意,没什么改进的意见,希望老师有更好更有趣的教学方法可以带动学生的积极性。其他就没什么了。

 

posted @ 2021-04-28 21:06  新南  阅读(85)  评论(0)    收藏  举报