java 面向对象基础与练习

学习心得

一、专业课

1面向对象

1 面向对象与面向过程的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把 这些步骤一步一步实现,使用的时候一个一个依次调用就可以了; 面向 对象是把构成问题事务分解成各个对象,建立对象的目的不 是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步 骤中的行为。

可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设 计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面, 4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤 29、输出最后结果。把上面每个步骤用不同的方法来实现。

如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来 解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的, 2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第 一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋 子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种 变化,同时利用第三类对象(规则系统)来对棋局进行判定


2设计思想

将现实中的事物抽象为对象,抽象出来的对象被赋予相应的状态和行为, 通过对消息的响应完成一定的任务

3类与对象的关系

类是对象的抽象,对象是类的具体实例

(类相当于生物学中的种类,对象就是种类中的一个具体实例)

4三大特性封装,多态,继承

1.封装

封装的定义:

  • 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系

为什么需要封装:

  • 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现

2. 继承

Java的类可以分为三类:

  • 类:使用class定义,没有抽象方法

  • 抽象类:使用abstractclass定义,可以有也可以没有抽象方法

  • 接口:使用inerface定义,只能有抽象方法

在这三个类型之间存在如下关系:

  • 类可以extends:类、抽象类(必须实现所有抽象方法),但只能extends一个,可以implements多个接口(必须实现所有接口方法)

  • 抽象类可以extends:类,抽象类(可全部、部分、或者完全不实现父类抽象方法),可以implements多个接口(可全部、部分、或者完全不实现接口方法)

  • 接口只能extends一个接口

继承以后子类可以得到什么:

  • 子类拥有父类非private的属性和方法

  • 子类可以添加自己的方法和属性,即对父类进行扩展

  • 子类可以重新定义父类的方法,即多态里面的覆盖

关于构造函数:

构造方法用于初始化对象不需要程序直接调用,在程序创建时,会直 接调用

如果类没有定义构造函数,jvm会创造一个,支持重载

  • 构造函数不能被继承,子类可以通过super()显示调用父类的构造函数

  • 创建子类时,编译器会自动调用父类的无参构造函数

  • 如果父类没有定义无参构造函数,子类必须在构造函数的第一行代码使用super()显示调用

类默认拥有无参构造函数,如果定义了其他有参构造函数,则无参函数失效, 所以父类没有定义无参构造函数,不是指父类没有写无参构造函数

3. 多态

在了解多态之前,首先需要知道方法的唯一性标识即什么是相同/不同的方法:

  • 一个方法可以由:修饰符如publicstatic+返回值+方法名+参数+throw的异常5部分构成

  • 其中只有方法名和参数是唯一性标识,意即只要方法名和参数相同那他们就是相同的方法

  • 所谓参数相同,是指参数的个数,类型,顺序一致,其中任何一项不同都是不同的方法

重载:

  • 重载是指一个类里面(包括父类的方法)存在方法名相同,但是参数不一样的方法,参数不一样可以是不同的参数个数、类型或顺序

  • 如果仅仅是修饰符、返回值、throw的异常不同,那这是2个相同的方法,编译都通不过,更不要说重载了

覆盖/重写:

  • 覆盖描述存在继承关系时子类的一种行为

  • 子类中存在和父类相同的方法即为覆盖,何谓相同方法请牢记前面的描述,方法名和参数相同,包括参数个数、类型、顺序

重写的规则:

  • 子类不能覆盖父类private的方法,private对子类不可见,如果子类定义了一个和父类private方法相同的方法,实为新增方法

  • 重写方法的修饰符一定要大于被重写方法的修饰符(public> protected > default > private)

  • 重写抛出的异常需与父类相同或是父类异常的子类,或者重写方法干脆不写throws

  • 重写方法的返回值必须与被重写方法一致,否则编译报错

  • 静态方法不能被重写为非静态方法,否则编译出错

多态可以分为两种类型:编译时多态(方法的重载)和运行时多态(继承时方 法的重写),编译时多态很好理解,后述内容针对运行时多态

5)匿名对象

//匿名对象是没有具体的对象所引用,就使用一次就变成垃圾了,被垃圾回收 器收回了

new Car.run();

6)访问修饰符

类内部    package内      子类         其他
public           
允许        允许         允许        允许
protected     
允许         允许          允许        不允许
default         
允许         允许          不允许     不允许
private         
允许         不允许        不允许     不允许

同一package可以理解为在同一个村庄

public可以理解为无论是否在一个村,谁都可以访问

protected可以理解为,只有自己一个村的邻居和子女,以及远嫁出去的子女可 以访问

default 可以理解为,只有自己同村的可以范围,如果子女和自己是同村,也可 以使用。如果子女远嫁出去,不在自己的村庄了,很抱歉,远水解不了近渴, 远亲不如近邻。

Private 可以理解为  私有财产不可侵犯,有些事情,除了自己,绝不能让其 他人访问,例如银行密码

7)代码段执行顺序

构造代码块:对所有对象都执行 (构造代码快优先于构造参数)

publicclassTest03{

inti;

publicTest03(int i) {

this.i= i;

System.out.println("构造代码段"+i);

}

{

System.out.println("普通代码段"+i);

}

static{

System.out.println("静态代码段");

}

publicstatic void main(String[] args) {

Test03test03 = new Test03(2);

Test03test032 = new Test03(3);

}

}

静态代码段

普通代码段0

构造代码段2

普通代码段0

构造代码段3

二、小组PK

1题目

1,程序输出结果是?

publicclass Test03 {

inti;

publicTest03(int i) {

this.i= i;

System.out.println(i);

}

{

System.out.println(i);

}

publicstatic void main(String[] args) {

inti = 2;

Test03test03 = new Test03(i++);

Test03test032 = new Test03(++i);

}

}


答案

0

2

0 //因为新生成的类,在新的堆的空间中,i的初始值为0

4

2、请找出下面程序的错误,可能有几处(请在错误语句后面打星*):

publicclass TestB {

inta;

staticchar c;

publicTestB() {

this(2);

this('c');*//调用构造函数的代码必须在第一行,所以第一行的没错,第二行的 有错

}

publicTestB(int a) {

super();

this.a= a;

}


publicTestB(char c) {

super();

this.c= c;

}

publicstatic void main(String[] args) {


TestBtestB = new TestB();

System.out.println(+testB.c); //只有一个值时,括号中()的+号会被无视就像 int[] a ={12}最后一个逗号被无视一样

}

}



3.请找出下面程序的错误,可能有几处(请在错误语句后面打星*):

publicclass TestC {

inta;

intb;

publicstatic void main(String[] args) {

newTestC().a;*

inta = 2;

System.out.println(b);* //因为main方法是静态方法,而b不是静态属性, 不能被直接调用

System.out.println(c);*

}

}




4.程序输出结果是?

publicclass TestD {

inta;

intb;

intc;

publicTestD(int a) {

super();

this.a= a;

}

publicTestD(int a, int b, int c) {

super();

this.a= a;

this.b= b;

this.c= c;

}

publicstatic void main(String[] args) {

TestDdi = new TestD(2);

di.a++;

di.b++;

di.c++;

TestDd1 = new TestD(8);

di.a++; //请注意这是di而不是d1

di.b++;

di.c++;

System.out.println(di.toString());

System.out.println(d1.toString());

}

publicString toString() {

return"TestD [a=" + a + ", b=" + b + ", c=" +c + "]";

}

}


答案:

TestD[a=4, b=2, c=2]

TestD[a=8, b=0, c=0]


5.程序输出结果?

publicclass TestE {

charc;

publicTestE(char c) {

super();

this.c= c;

}

publicTestE() {

}

publicvoid printE() {

if('0'>c) {

System.out.print('c');

}

}


publicstatic void main(String[] args) {

TestEe = new TestE('0');

TestEe1 = new TestE();

e1.printE();

e.printE();

System.out.print('0');

}

}


答案:

c0

2、对方题目

classTest{

inti =2;

charc = 65;

voidTest(){

i= 3;

c= 'c';

}

}

publicclass Demo {

publicstatic void main(String[] args) {

Testt = new Test();

System.out.println(t.i);

System.out.println(t.c);

}

}


以上程序 编译能否通过?

若能 写出运行后的结果;

若不能 说出原因

可以运行

输出:

2

A


2publicclass Demo1 {

publicstatic void main(String[] args) {

int[]a = null;

for(inti=0;i<5;i++){

a[i]= ++i;

}

for(inti :a){

System.out.println(i);

}

}

}


以上程序 编译能否通过?

若能 写出运行后的结果;

若不能 说出原因


可以通过

运行会出现空指针异常


3classFlower {

doublehight;

Stringcolor;

Stringkind;

intnum;

hight= 0.8;


{

this.kind= "水仙花";

}

Flower(Stringcolor, int num) {

this.color= color;

this.num= num;

}


voidstart() {

System.out.println(":"+ this.hight + " 颜色:"+

this.color+ " 种类:"+ kind + " 数量:"+ num);

}

}


publicclass Demo {

publicstatic void main(String[] args) {

Flowerf = new Flower("红色",4);

f.start();

}


}



以上程序 编译能否通过?

若能 写出运行后的结果;

若不能 说出原因


不能 hight为成员变量 不能在初始化之后 在方法外再赋值


4publicclass Demo04 {

publicstatic void main(String[] args) {

inta = 2;

intb = 1;

newDemo04(b, a); //找不到对应参数列表的函数

}

Demo04(inta, int b) (1,2)

{

System.out.println(a+ b); 3

{

newDemo04(1.0,2); syso 3.0

run(); sysop

}

}

voidrun()

{

System.out.println("P");

}

Demo04(doubleb , int a)

{

System.out.println(a+ b);

}

Demo04(inta , double b)

{

System.out.println(a+ b);

}

}

以上程序 编译能否通过?

若能 写出运行后的结果;

若不能 说出原因

3

3.0

P



5packagecom.java.cheng;

publicclass Test {

publicstatic void main(String[] args) {

Test1t = new Test1();

t.run(2,3);

t.run(4,8);

}

}

classTest1 {

inta;

intb;

voidrun(int a, int b) {

this.a=a;

System.out.println(sum());

}

{

this.a= 5;

this.b= 4;

System.out.println(a* b);

}

intsum() {

returna + this.b;

}

}

以上程序 编译能否通过?

若能 写出运行后的结果;

若不能 说出原因


20

6

8


学习心得:

1.不管程序多奇怪,万变不离其宗,看到程序时,必须静下心,理清代码的执行顺序





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值