java入门笔记(3)

while循环结构

while(condition) {

// body of loop

}

一般在循环体内控制循环的结束条件:让循环条件为false或break

4.2  do while循环结构

do {

// body of loop

} while (condition);

至少执行一次循环。

示例:

分别使用while和do-while循环计算1-100的和

4.3  While和do while的区别

do  while先执行  后判断     所以它至少执行一次

while先判断条件  再执行     有可能一次也不执行

所有的循环,都可能出现死循环

4.4  for循环结构

4.4.1  语法

for(initialization; condition; iteration) {

// body

}

四个部分:初始化部分A、循环条件B、循环体D、迭代部分C

A只执行一次。

执行B判断真假,如果真T,执行D,然后再执行C变量变化

演示案例:

使用for循环计算1-100的和

4.4.2  嵌套的for循环

循环是可以嵌套的,包括while和do-while循环

4.4.3  使用两个变量控制循环

案例:输入两个数,查找两个数的中间数

for(int i=0, j=10; i

//输出i和j的值

}

练习总结:

学生基本语法可以掌握,稍有逻辑不会,建议多做稍有逻辑练习题

例如:

i%2==0  知道是2的整倍数的判断  基本语法没问题

判断一个数字i 能否被2 到(i-1)任意一个整除,就不会了。

4.5  break和continue

break:终止直接包含的循环体,结束(本层)循环

continue:终止本次循环,直接执行循环的下一次

案例:

打印1-20之间的偶数,如果大于10则终止循环(break)

打印1-20之间的偶数,如果等于10则终止本次循环(continue)

数组

5.1  数组的概念

一个具有固定大小,可以容纳相同类型数据的集合.

数组元素的类型:可以是基本类型,也可以是引用类型

数组可以认为是Java中最简单的复合类型。

数组的声明和使用,在语法上与C语言类似,但是在内部实现机制上有本质的区别。

5.2  数组声明

两种方式:强烈建议采用第一种方式

int[]  nums;  或

int  nums[];

5.3  数组创建与初始化

5.3.1  使用new创建数组

int[] nums;        //声明数组,并没有创建数组,没有开辟堆内存。

nums = new int[5];  //创建数组,必须设置长度   开辟堆内存

new:用于分配内存的特殊运算符。通过new分配的数组,其元素会被自动初始化为0(对于数值类型)、false(对于boolean类型)或null(对于引用类型)。

说明:获得一个数据需要两个步骤,第一步是声明,第二步是创建数组对象。

一个数组就是一个对象。数组是动态创建的,所有对象都是动态创建的。

5.3.2  创建数组的三种方式

int[]  nums = new int[5];  //初始化为默认值

int[]  nums = {1,2,3,4,5};  //初始化为{}中指定的值,静态初始化

int[]  nums = new int[] {1,2,3,4,5};//初始化为{}中指定的值,静态初始化

5.3.3  创建数组需要注意的问题

1、创建数组时必须知道数组的长度,否则new不知道要开辟多大的内存

2、第二种方式创建数组,必须在声明数组的同时创建数组

3、创建数组之后,数组的长度不能再改变。

说明:

数组的初始化分为静态初始化和动态初始化,静态初始化在初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。

5.4  数组操作

1、通过下标访问数组元素

为指定的数组元素赋值、使用数组元素。如果数组下标越界,会抛出异常。

2、通过循环处理数组(打印输出所有数组元素)

数组与循环是分不开的

3、可以使用length属性获取数组的长度,从而可以避免数组越界。

示例5.1

创建数组、静态初始化、遍历输出数组元素

示例5.2  随机数生成

使用Math类的random方法,动态初始化

类与对象的概念

类:指的是对客观事物的一种描述,是对现实中一类具有共同属性和行为的事物的抽象。

对象:指的是具体存在的事物,是能够看得到摸的着的真实存在的实体。

举例说明:

我们可以将“汽车”看作一个类,在这个类中定义了汽车的属性和行为,比如颜色、品牌、速度等属性,以及加速、刹车、转弯等行为。

那么,当我们要描述具体一辆汽车时,就需要创建一个该类的对象,并根据需要设置其相应的属性值或对其进行行为操作。

另外,我们可以根据同一个类创建多个不同的对象,每个对象的属性值和行为可能都不同。例如一个品类的汽车肯定不止一台实车。

因此,也可以理解成,类表示的是共性,对象则用来表示具体个性。

6.1.1  面向对象的概念

面向对象编程:OOP(Object-Oriented Programming)

6.1.2  使用类和对象开发程序的基本步骤

对于面向对象编程,主要工作就是编写类。面向对象开发的步骤:

l 开发类,类 = 属性(成员变量) + 方法

l 通过new关键字创建对象

l 使用类中的属性和方法:对象.属性名  对象.方法名()

6.1.3  类与对象

(1)类是一种逻辑结构,对具有公共属性特征和行为(功能)的一个群体进行描述。例如可以定义Student类描述学生的公共属性和行为,定义一个Teacher类,描述老师的公共属性和行为。

(2)定义了类之后,就可以根据类创建(new)出一个实例。比如学生张三,老师王老师。

通俗地说:

类定义了一种新的数据类型。对象就是根据类定义的变量。可以将类看做是复合类型。

类是对象的模板(template),对象是类的实例(instance)。因为对象是类的实例,所以经常会看到交换使用“对象”和“实例”这两个词。

教学需要注意的问题:

开始时不要讲理论,提示一下后就直接编写类,声明并创建对象。然后结合具体的程序,介绍上面的概念。

6.2  定义类

程序 = 数据  +  算法

类   = 属性  +  方法

6.2.1  类的一般形式

class 类名 {  //类名通常以大写字母开始

类型  变量1;

类型  变量2;

类型 方法名(参数列表) {

// 方法体

}

}

在类中定义的变量和方法都称为类的成员。所以变量又称为成员变量,方法又称为成员方法。

6.2.2  类的属性

类的成员变量又称为类的属性。

public class Student {

/**

 * 属性 成员变量

 * 类的{}内直接声明(定义)的变量  叫  成员变量/实例变量

 */

String  name;

int  age;

double  score;

}

属性属于类的某个具体对象。类的每个实例(即,类的每个对象)都包含这些变量的副本,因此在类中定义的变量又被称为实例变量。

6.2.2  类的方法

方法是对象行为特征的抽象,类具有的共性的功能操作,称之为方法。方法是个“黑匣子”,完成某个特定的应用程序功能。

方法的基本语法:

修饰符  返回类型  方法名(形参列表){

//功能代码

}

形参可以为空,可以有多个,形参的类型可以是基本类型也可以是引用类型。

public class Student {

String  name;

int  age;

double  score;

void  study(){

//

}

void  show(){

//

}

}

注意:

方法中定义变量称为局部变量。

如果没有返回值,则方法的返回类型必须为void

当方法有具体的返回类型时,则必须使用return语句返回一种值。

方法深入分析:

对象的声明与创建

Student   stu1;    //声明对象的引用

sut1  =  new Student();  //创建对象

public static void main(String[] args) {

Student stu1 = new Student();

stu1.name = "张三";    //访问对象的属性

stu1.age = 20;

stu1.score=95.5;

stu1.show();           //方法调用

Student stu2 = new Student();

stu2.name = "李四";    //访问对象的属性

stu2.age = 22;

stu2.score=98;

stu2.show();           //方法调用

Student stu3 = stu2;

stu3.show();

}

提示:如何使用对象的成员变量和方法

注意:

属性属于类的具体对象,不同对象的属性值通常是不同的。

虽然方法也是通过对象调用的,但是各对象共享相同的方法。

教学需要注意的问题:

带着学生多定义几个简单的类,让学生自己也多定义几个类。

逐步增加类的复杂程度

6.4  类练习

Teacher类

定义Teacher,属性:姓名,年龄,工资

方法:Teach(); Show();

Box类

属性:长、宽、高

方法:计算体积

Dog类:

属性:name color、age

方法:eat()

Cat类:

属性:name color、age

方法:eat()

Triangle类:底、高、计算面积

Reatangle类:长length、宽width,计算面积area

Circle类:半径,计算面积

测试类:Engineer类

6.5  为引用变量赋值

//Box b1 = new Box(); //创建对象,让b1指向(引用)所创建的对象

Box b2 = b1;

注意:b1和b2引用同一个对象。

对象引用与对象的关系:

(1)对象引用,有时也称为对象引用变量,或称为引用变量。

(2)对象引用与对象在物理上是两个不同的东西。

(3)对于上图,我们通常说b1引用(有时也称为指向)图中的那个Box对象。

(4)对象只能通过对象引用来操作。有时直接使用对象引用代指对象,例如对于上面的例子,有时会直接将b1引用的对象称为“对象b1”或“”b1对象。

(5)将一个对象引用赋值给另一个对象引用,则两个引用变量指向同一个对象。

(6)对引用变量进行相等性比较,例如b1==b2,是比较两个引用变量是否引用同一个对象,所以b1==b2的结果为true。对对象引用进行相等性比较,有时也直接称为对象的相等性比较。

注意:基本变量与引用变量的区别

基本类型的变量位于栈内存中,引用变量所所引用的变量位于堆内存中。

6.6  构造器/构造方法

构造方法的作用:给类(对象)中的属性初始化

实例化:创建对象的实例,开辟对象的数据存储空间

初始化:给对象中的属性进行初始化的赋值

构造方法和普通方法的不同,构造方法不需要声明返回,并且方法名和类名相同

public 类名(){ }

构造方法不需要手动去调用,而是在我们创建对象编写: new 类名() 就是在调用

类的无参构造方法

6.6.1  构造方法的语法

构造方法的作用:开辟内存空间、创建实例、初始化属性值。

构造方法的特点:

(1)方法名与类名相同

(2)不能声明返回类型

(3)不能使用return语句返回值

(4)通常为public

怎么定义构造器

构造方法的名字必须和所在类的名字一致,没有返回值,但不能声明void,访问权限可以为任意,但是一般情况下使用public方法权限,构造方法中的参数可以根据需要自行定义,参数的不同的构造方法构成重载

public 构造方法名(参数){ ... }

/*注意: 1.构造方法没有返回值类型 2.构造方法名必须和该类的类名保持一致,大小写都一样

public Fu(){} //无参的公有构造方法

public Fu(int i){} //参数类型为int的公有构造方法

public Demo(){} //无参的公有构造方法

public Demo(int i){} //参数类型为int的公有构造方法

public Demo(int i,double d){} //参数类型为int和double的公有构造方法

构造器的使用

Java中构造方法的使用有两个地方,一个是跟在关键字new后面,类名加上一个小括号(),小括号内根据实际加上实参,另外一个是跟在关键字super或this后加上一个小括号(),小括号内根据实际添加实参,下面进行举例。

例1:

Demo demo = new Demo(); //这里是调用的是一个无参的构造方法,必须声明在方法中,最好声明在主方法

上面构造方法的参数根据实际添加实参,Jvm根据构造方法的参数不同加载不同的构造方法

public Demo(int a){ this.a=a; //这里调用参数为int类型的本类的构造方法 }

注意:例中this调用构造方法只能出现在构造方法中,而且必须出现在第一行,所以一个构造方法中第一行只能为this或super调用构造方法,两者不能同时调用构造方法出现,而且注意this或super调用构造方法时,要留构造方法出口,意思就是最后调用的构造方法中没有再调用别的构造方法!

注意:

(1)如果没有明确提供构造方法,则系统会提供一个默认的构造方法,默认构造方法(也称为缺省构造方法)没有参数。

(2)如果我们提供了一个构造方法,则系统不再提供无参数的默认构造方法。

(3)如果我们提供了一个有参数的构造方法,同时又需要无参构造方法的话,则必须同时提供一个无参数的构造方法。

7.3  方法深入分析

方法可以看做是独立的功能模块,供调用模块调用,功能模块要有输入、输出,对于方法而言输入就是方法的参数,输出就是方法的返回值。调用者通过参数将需要输入的数据传递给方法,方法通过返回值将输出返回给调用者。

7.3.1  方法定义

1、方法定义包括:访问修饰符、返回类型、方法名、形参、代码块

2、方法必须有返回类型(构造方法除外),可以省略访问修饰符

3、可以有参数,也可以没有参数

7.3.1  方法调用

1、实参与形参的概念

2、方法调用的执行过程

7.3.2  参数传递

方法调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

参数传递:

值传递:Swap(int a, int b)方法

引用传递(对象作为参数,本质上是引用变量作为参数)

7.3.3  return

(1)return语句用于明确地从一个方法返回。即,return语句导致程序的执行控制转移回到方法的调用者。

(2)如果return之后还有代码也不会执行。

(3)如果方法的返回类型为void,可以使用return跳出函数,但是不能使用return返回数据。

(4)可以返回对象。

7.3.4  方法调用

因为封装,不能直接访问其他对象的成员变量,通常是调用其他对象的方法。方法调用有两种情况:

调用相同类中的方法:可以直接调用。(本质上是使用this关键字调用)

调用其他类中的方法:对象.方法名

封装的概念

封装是面向对象的三大特征之一。

面向对象的三大特征是:封装、继承、多态。

类 = 属性 + 方法,类是对属性和方法的封装。类封装了类的成员。

结合Student类,介绍后续内容:

如果在类的外部可以随意访问类的成员,那将属性和方法放到类中就没有意义了。因此Java允许在类中通过访问修饰符控制类成员的访问权限。之前已经接触过public访问修饰符。

7.2  访问控制

在完整学习访问控制之前,先熟悉一下包的概念。

7.2.1  包与访问范围

(1)包的概念

类通常位于某个包中,包(packages)是多个类的容器。它们用于保持类的名称空间相互隔离。因此包是一种名称机制。

例如,Java类库中的类,分别包含在不同的包中:java.lang;java.util。例如String类位于java.langl包中。

(2)定义包

package  pack1

(3)层次化的包

package  com.xszx.sjt2111

(4)包与目录结构

位于包中的类,在文件系统中也必须有与包名层次相同的目录结构。

需要指出的是,包名与文件目录结构一致是针对.class文件而言的,对于源代码文件没有这一要求,但是通常也将源代码文件放到与包名一致的目录结构中。并且建议将源文件与类文件分开存放。

(5)导入包

类的全名为:包名.类名。例如在com.xszx包中定义的Student类,其全面为com.xszx.Student。

当在不同的包中使用某个类时,需要使用类的全名,如果包名很长的话,使用类的全名不是很方便,这时可以通过导入包来避免使用类的全名。

导入包的目的:减少输入

导入包的两种方式

import  java.util.Scanner;

import  java.util.*;

包既是一种命名机制,也是一种可见性控制机制。可以在包中定义该包外部的代码不能访问的类成员。

7.2.2  访问修饰符与访问范围

类是对类成员(属性和方法)的封装,可以通过不同的访问修饰符控制类成员的可见范围,即控制类的成员在多大的范围是可见的。

类成员的访问范围划分为四个:本类、本包、子类、全局(所有包)

为类的成员指定不同的修饰符,就是控制成员的在什么样的范围内是可见的,即在什么样的范围是能够访问的。

private

默认

protected

public

同一个类中

相同包中的其他类

子类(不同包、相同包)

全局(所有包)

访问范围:  本类   <  本包   <  子类  < 全局(所有包)

访问修饰符:private  <  缺省(default) < protected  <  public

封装的通常做法:

(1)将类的属性的访问权限设置为private,提供访问权限为public的set和get方法。在有些情况下不提供set和get方法,有时只提供其中的一个。

(2)提供合理的构造方法,即开发相应参数的构造方法,方便实例化对象。

(3)类的全部或部分方法的访问权限为public,类的公有方法是类对外开放的接口,供外部代码使用类的功能。类的私有方法通常是辅助方法实现部分功能,供类的公有方法调用。

public class TestPersonDemo {
	public static void main(String[] args) {
		/********* begin *********/
		// 声明并实例化一Person对象p
      Person p = new Person();
		// 给p中的属性赋值
   p.setName("张三");
 
   p.setAge(18); 
		// 调用Person类中的talk()方法
p.talk();
		/********* end *********/
 
	}
}
 
// 在这里定义Person类
class Person {
	/********* begin *********/
   private String name;
   private int age;
   public void setName(String name){
       this.name = name;
   }
   public void setAge(int age){
       this.age = age;
   }
   public String getName(){
       return this.name;
   }
   public int getAge(){
       return this.age;
   }
   public void talk(){
 // System.out.println("我是: "+name+", 今年: "+age+"岁");
 System.out.println("我是:"+name+",今年:"+age+"岁");
   }
	/********* end *********/
}

封装案例:

在p1包中定义Student类

在p1包中定义StudentTest类,使用Student类,访问该类中的成员变量和方法。

将StudentTest类的定义放入到p2包中,再次访问类中的成员变量和方法。

封装案例:堆栈类

让学生体会封装的原理。

7.4  方法重载

7.4.1  方法重载基础

直接切入主题:

在类中可以定义名称相同的方法:只要形参列表不同即可。

特点:

1、方法名相同

2、形参列表不同:形参的类型/顺序、形参的个数

注意的地方:

1、返回值在区分重载方法时不起作用。修饰符也不起作用

2、当调用重载方法时,Java使用参数的类型和/或数量确定实际调用哪个版本。

方法重载案例:

Calculator类,添加add()方法,计算两个数的和。int  float  double

7.4.2  重载构造方法

Box(double length, double width, double height)

Box(double dim)

Box(Box box)

Box()

特别说明:

在某个构造方法中可以使用this()调用重载的构造方法:

public  Box(double dim){

this(dim, dim, dim)

}

class Overloading {
	public int test() {
		System.out.println("test1");
        return 1;
    }
    public void test(int a) {
        System.out.println("test2");
    }   
    //以下两个方法中参数类型的顺序不同
    public String test(int a,String s) {
        System.out.println("test3");
        return "test方法被重载第二次";
    }   
    public String test(String s,int a) {
        System.out.println("test4");
        return "test方法被重载第三次";
    }
}
public class Overload {
	public static void main(String[] args) {
		Overloading a=new Overloading();
        System.out.println(a.test());
        a.test(1);
        System.out.println(a.test(1,"test3"));
        System.out.println(a.test("test4",1));
	}

  • 35
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值