本周是java编程学习的第二周,本周的主要内容为进行了第二章内容进行总结的练习以及面向对象的相关学习。
第二章综合练习:双色球
第二章的双色球练习主要考量的知识点有定义变量、构造数组、分支语句和循环。其中生成一定范围内的随机数的原理是使用Random指令在一定范围的数组中进行随机挑选,为了挑选的数不重复,可以在编程时将取出的值设为数组外的数,这样便可以实现不重复取数的效果。然后根据随机生成数与用户选择数进行比较,根据不同情况输出不同的中奖情况即可。
面向对象基础
本周的重点在于学习了面向对象的相关内容。首先是关于基础知识,面向对象是一种软件开发方法,它的特点在于它将关注点放在具备相关功能的对象,即不关注过程,而是把想要实现的功能交给能做的对象,让它们去实现具体功能,例如:在正常面向过程的思维中,我们日常生活往往要考虑各种琐事,洗衣、做饭等;而在面向对象的思维下,我们便是将这些琐事交给一个管家,然后让他来做这些事。
面向对象分别有三大思想与三大特征,前者分为
1.OOA:面向对象分析
2.OOD:面向对象设计
3.OOP:面向对象程序
而后者则是
封装性:所有内容内部封存,外部不可见。
继承性:将功能继承下来继续使用。
多态性:主要体现在方法重载。
接下来,便是要区别类与对象。前者相当于是一个综合的特征,而后者则相当于是具体的一个个体。而类又由属性与方法组成,属性相当于个体的特征,方法则是个体的行为。类的定义格式为
class 类名{
成员属性;
成员方法;
}
而对象则是展现与执行类中属性与方法的载体,它的定义格式如下
类名 对象名 = new 类名();
访问类中属性:对象.属性;
执行类中方法:对象.方法(具体参数);
创建对象的内存分析
这一部分主要分为三块进行描述。首先是栈,栈的区域很小,它存储的是基本数据类型的数据和引用数据类型的数据,它的特点是存储速度快,存储时先进后出,可以理解为装水倒水。然后是堆,堆存放的是类中的对象,即通过new关键字创造的对象。最后是方法区,方法区存放的是类信息、静态变量、常量与成员方法。
构造方法
构造方法作用为对象的初始化,它在创建对象时自动调用,好比
Book b1 = new Book();
后面的小括号中便是调用了无参的构造方法,若是类中有变量时,建议使用有参的构造方法,若参数均为常量,则使用无参较好。
方法重载
方法重载指的是方法名称相同,为了满足不同需求,改变参数类型或参数长度的一种方法。例如
int sum(int x,int y){
return x+y;
}
double (double x,double y){
return x+y;
}
其中需要注意的是,方法重载与返回值类型无关。
其中还有构造方法重载,即满足不同的创建对象需求,如
Person (String name2,int age2){
name=name2;
age=age2;
}
Person(String name2){
name=name2;
}
还有一个匿名对象的知识点,即无对象名的对象,常用于使用一次的数据,如
int num = new Math().sum(100,200);
System.out.println(num);
面向对象进阶
封装
封装的作用是为了避免在设置属性数据时发生逻辑错误,为其提供set与get方法,即设置与取得的方法,如
this关键字
this关键字用于调用类中的属性、调用类中的方法或构造方法、表示当前对象,在上述示例中可以看到。
static
static表示“静态”,用于修饰成员变量和成员方法,它主要作用于创建独立于具体对象的域变量或方法。简单来说被static修饰的方法或量无需依赖对象进行访问,只要类被加载,便可通过类名进行访问,内存也始终仅存一份。但需要注意的是静态不可访问非静态,但非静态可以访问静态。
代码块
即{}中的内容。
包
相当于文件夹,将各个功能相关或相似的类或接口组织存放在其中,同时包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
import关键字
用于导包,现在用的最多的是导“Scanner”与“Random”
权限修饰符
有四种,分别为public、protected、default、private,其中运用最多的是权限最大的public与最小的private。
main方法
系统规定好的方法名称,用于执行系统规定的各种操作。
面向对象高级
继承
继承便是子类可以继承父类的特征与行为的意思,它的出现使得在编程时可以建立有等级层次的类。其格式为
class 子类名 extends 父类名{}
super关键字
子类可通过super关键字访问父类的属性与方法
重写
与重载类似,它的规则为
1.参数列表必须与被重写方法的相同;
2.返回类型必须完全与被重写的方法相同;
3.访问权限不能比父类被重写方法的访问权限更低;
4.父类的成员方法只能被它的子类重写;
5.声明为static和private的方法不能被重写,但可以被再次声明。
与重载的区别
1.重载发生在一个类中,而重写发生在子父类中;
2.重载的参数列表必须不同,重写必须相同;
3.重载与返回值类型无关,重写的返回值类型必须一致;
4.重载与访问权限无关,重写中子类的方法权限不能小于父类;
5.重载与异常处理无关,重写的异常范围更小,但不能抛出新的异常。
final关键字
final用于修饰属性、变量,使变量变为常量,无法对其再次进行赋值,而且final修饰的局部变量只可赋值一次(可先声明后赋值),
而且它修饰的是成员属性,必须在声明时赋值。其中常量的命名单词与单词之间要用下划线隔开,且所有字母均为大写。
抽象类
抽象类必须用abstract class声明,格式为
abstract class 类名{}
抽象方法
只声明而未实现的方法称为抽象方法,格式为
abstract class 类名{
public abstract void 方法
}
其中需要注意的是,抽象类本身不能直接进行实例化,即无法直接使用new完成,而且一个抽象类必须被子类继承,被继承的子类若非抽象类则必须覆写或重写抽象类中的全部抽象方法。
而且抽象类无法被final声明,但能有构造方法。
与普通类的区别在于
1.抽象类必须用public或protected修饰;
2.抽象类不可以使用new关键字创建对象,但其子类创建对象时,抽象父类也会被实例化;
3.若一个子类继承抽象类,那么必须实现所有的抽象方法。如有仍未实现的,则子类也必须定义为abstract。
接口
若一个类中的方法均为抽象方法,所有属性均为全局常量,那么此时便可将该类定义为一个接口。格式为
interface 接口名{
全局常量;
抽象方法;
}
面向接口编程思想的优点
1.降低程序耦合性;
2.易于程序的扩展;
3.有利于程序的维护。
关于简写
1.全局常量编写时可省略public static final关键字;
2.抽象方法编写时可省略public abstract关键字。
关于多实现
接口可以多实现,一个子类还可以既实现接口又继承抽象类,格式为
class 子类名 extends 父类名 implements 父接口1,父接口2,。。。{}
接口与抽象类的区别
1.抽象类要被子类继承,接口要被类实现;
2.接口只能声明抽象方法,抽象类中可以声明抽象方法,也可写非抽象方法;
3.接口中定义的变量只能是公共的静态常量,而抽象类中的变量是普通变量;
4.抽象类无法多继承,但接口可以多实现;
5.抽象类中可以包含static方法,接口中则不允许;
6.接口不能有构造方法,抽象类有。
多态
多态即为对象的多种表现形式,如重载与重写,它的作用类似于基本数据类型的转换,格式为
向上:父类 父类对象 = 子类实例;
向下:子类 子类对象 = (子类)父类实例。
instance of
它的作用为判断某个对象是否为指定型的实例,格式为
实例化对象 instance of 类
该操作返回boolean类型的数据。
Object类
Object类是所有类的父类,若一个类没有明确继承某一具体的类,则将默认继承Object类。且Object类可以接收任意的引用数据类型
toString
此方法用于返回对象的字符串表现形式,在Object中,该方法则是返回对象的内存地址。
equals
指示某个其他对象是否“等于”此对象
内部类
被定义在一个类或方法中的类,包括四种:
1.成员内部类
2.局部内部类
3.匿名内部类
4.静态内部类
以成员内部类为例,它是最普通的内部类,格式为
class Outer{
class Inner{}
}
成员内部类可无条件访问外部类所有的成员属性与方法,但若成员内部类拥有和外部类同名的成员变量或方法时会隐藏,此时默认情况下访问的是成员内部类中的成员,若要访问外部类中的对应成员需要使用this关键字。
包装类
用于将八种数据类型变为引用数据类型所对应的类名。
递归
在方法的定义中使用自身,即是一种直接或间接调用自己方法的算法,在实际编程中,若是能使用循环则尽量不使用递归,因为递归有个等待的过程,运算较慢。下面展示一个计算5的阶乘的递归
class Demo{
public static void main(String[] args){
}
public static int fact(int n){
if(n == 1){
return 1;
}else{
return n* fact(n-1);
}
}
}
上图展示了面向对象高级任务中的部分代码,这个任务目的是为设计一个与系统进行猜拳的小游戏,这个任务可通过在一个包中放入几个不同的类模块来实现,这样编程更加清晰与方便。