第四天---java面向对象编程(一)

一、Java方法(函数)。

概念

概念:也叫函数,其实就是具有一定特殊功能的一段代码,将需要在多个位置重复使用的一组代码,定义在方法内部。

意义:1.避免了重复的代码,2,增强了程序的扩容性

定义方法:

用法:

step1:方法的定义(声明)

public static void main(String[] args) {}

语法格式

   [修饰符1,修饰符2...] 返回值/void 方法名(参数列表){
        .......
        return
    }
    public static void main(String[] args)

示例

package com.tuling.part1;

public class Demo_method {
/*    [修饰符1,修饰符2...] 返回值/void 方法名(参数列表){
        .......
            return
    }
    public static void main(String[] args)*/

//    step1:定义方法
//    方法名:标识符,尽量见名知意,驼峰命名法,动宾结构
    public static void getSum() {
        int sum = 0;
        for (int i = 0; i <= 10; i++) {
            sum += i;
        }
        System.out.println("1-10之间的和:"+sum);
    }

//    定义有返回值的方法
    public static int getSum2(){
        int sum = 0;
        for (int i = 0; i <= 10; i++) {
            sum += i;
        }
        return sum;//1.结束方法的执行,2.将值返回值方法调用的地方
    }
//    定义有返回值有参数的方法
    public static int getSum3(int num){//形参
        int sum = 0;
//        下面的<=号后面的注意下最好不要有空格,另外)后面一定不要有空格哦
        for (int i = 0; i <=num; i++){
            sum += i;
        }
        return sum;
    }
    public static void main(String[] args) {
//        具有一段特殊功能的代码
//        求1-10之间的和

        int sum = 0;
        for (int i = 0; i <= 10; i++){
            sum +=i;
        }
        System.out.println("1-10之间的和:"+sum);

        System.out.println("hello,world");
        System.out.println("hello,world");

//        step2: 当前的调用
//        没有返回值的方法调用: 方法名();
//        求1-10之间的和

//       其实下面的getSum();的调用实际上是需要加上 Demo_method的,当在同一个类中调用static方法的时候,可以省略这个方法,要是调用别的时候一定要加上
getSum(); System.out.println("hello,world"); System.out.println("hello,world"); // 求1-10之间的和 getSum(); System.out.println("----------------------"); // 有返回值方法的调用, 变量 = 方法名(); int resoult2 = getSum2(); System.out.println("resoult:"+resoult2); // 有返回值有参数的方法的调用: 数据类型 变量 = 方法名(实际的参数); System.out.println("------------------------"); int result3 = getSum3( 5 );//实参 int result4 = getSum3(20 ); System.out.println("1-5的和为:"+result3); System.out.println("1-20的和为:"+result4); } }

修饰符:public statIc

返回值:一个方法执行后,返回给调用处的结果,可能有,也可能没有;

  有:在方法定义的时候,写清楚方法要返回的数据的类型,

  没有:void,表示这个方法执行结束之后,没有返回值给调用处

方法名:也是一种标识符,首字母小写,驼峰式命名

():方法的标识,括号里,参数列表

{}:方法体

参数列表:方法在运算过程中的未知数据,调用者调用方法时传递。

return:将方法执行后的结果带给调用者,方法执行到return,整体方法运行结束

 

调用方法

setp2:方法的调用(如果一个方法只有定义,那么方法中代码并没有被执行,只有被调用了才会执行方法中的代码)

通过方法的名字进行调用

static的方法,静态方法
    类名,方法名(),本类中类名可以省略
非static的方法,非静态类名
    创建改类的对象,通过对象调用方法
    类名,对象名 = new 类名();
    对象,方法名();

示例

package com.tuling.part1;

public class Demo_method2 {
//    定义一个方法,打印5次hello,world
    public static void print(){
        for (int i = 0 ; i<5; i++){
            System.out.println("hello,world");
        }
    }
    public static void main(String[] args) {

//        step2:非static方法的调用
//        1.要创建对象
        Demo_method2 obj = new Demo_method2();
//        2.用对象名,方法名();
        print();
    }
}

 方法的返回值

如果一个方式调用之后,需要返回给调用处结果,那么表示这个方式有返回值,在方法中需要使用return语句把结果返回给调用处

//方法定义
public static 返回值类型 方法名(){
    //......
    return 结果;
}

//方法的调用处
变量 = 方法名(); //变量 = 结果

如果一个方法,没有返回值,那么写void即可

return语句

A:把方法中的返回值,返回给方法的调用处

B:同时结束了这个方法的执行

注意点

  1.如果一个方法声明了返回值,那么方法中一定要使用return语句的返回结果

  2.定义方法的时候,声明的返回值类型,一定得和return后实际上返回的数据类型一致

  3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到

  4.如果一个方法声明没有返回值(void)那么方法中也可以使用return语句,用于强制结束方法的执行

package com.tuling.part1;

public class Demo_return {

    //1.如果一个方法声明了返回值,那么方法中一定要使用return语句的返回结果
    public static double getNum(){
        return 3.4;//兼容的数据类型 会发生隐式类型转换
    }
    //2.定义方法的时候,声明的返回值类型,一定得和return后实际上返回的数据类型一致
    public static byte getNum2(){
        byte b = 34;
        return b;
    }
    //3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到
    public static int getNum3(){
        int num = 34;
//        if (num>0){
//            return num;
//        }else{
//            System.out.println("num:"+num);
//            return 0;
//        }
        
        for (int i = 0; i <5; i++){
            if(i==2){
                return i;
            }

        }
        return 0;
    }
    //4.如果一个方法声明没有返回值(void)那么方法中也可以使用return语句,用于强制结束方法的执行
    public static void getNum4(){
        int num = 12;
        if(num>0){//如果符合条件那么就会进入分支,然后执行return,结束方法执行
            return;
        }
        System.out.println("hello,num:"+num);
    }


    public static void main(String[] args) {

    getNum4();
    }
}

 方法的相互调用

package com.tuling.part1;

public class Demo_method3 {
    public static void test1(){
        System.out.println("test1()......");
    }
    public static void test2(){
        test3();
        System.out.println("test2().......");
        test1();
    }
    public static void test3(){
        test1();
        System.out.println("test3()......");
    }

    public static void main(String[] args) {
        test1();
        System.out.println("----------------------");
        test2();
        System.out.println("-----------------------");
        test3();
    }
}

方法的参数

一个方法中有些数据的数值不一定,我们定义为参数,有调用处调用方法的时候,传入具体的数据

* 形式参数:形参

* 定义方式,声明的参数,用于接收调用处传来的数据

* 实际参数:实参

* 调用方法的数,实际赋值给形参的数据

示例

package com.tuling.part1;

public class Demo_param {
//
    public static void printShape(int n,int m,char c){

        //        打印一个直角三角形
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
//          换行
            System.out.println();
        }

    }
    public static void main(String[] args) {
//        下面有时候执行不出来需要按一下shift
        printShape(8,20,'c');//实参和形参要一一对应,参数的个数,类型,顺序都要一一对应
    }
}

 方法分类

有返回值:

  有参数返回值:public static返回值类型,方法名(形参列表){}

  无参数返回值:public static 返回值类型 方法名(){}

无返回值

  有参数无返回值:public static void 方法名(形参列表){}

  无参数无返回值:public static void 方法名(){}

方法重载

概念:一个方法多种形式

* 同一个类中

* 方法名相同

* 参数列表必须不同(顺序,个数,类型)

与static 返回值,其他的修饰符。。。。这些无关

示例

package com.tuling.part1;

public class Demo_overload {

//  方法的重载:同一个类当中,方法名相同,参数列表不一样(个数,顺序,类型)
    public static int getSum(int a,int b){
        return a+b;
    }
//
    public static double getSum(double a,double b){
        return a+b;
    }
    public static int getSum(int a,int b,int c){
        return a+b+c;
    }

    public static void main(String[] args) {
        getSum(3,5);
    }
}

 递归

方法中调用方法本身,就叫做递归方法

递归方法一定有出口,逐层的向出口靠近

示例:

package com.tuling.part1;

public class Demo_recursive {
    //
    public static void test1(int n) {
        System.out.println("test1().......");
        if (n == 1) {
            return;//方法的出口,每一次执行的时候都是会调用一次的。
        }
        test1(n - 1);//递归,自己调用自己
    }

    public static int getSum(int n) {
//        int sum = 0;
//        for (int i = 0; i <= 5; i++) {
//            sum += i;
//        }
//        return sum;
        if(n==1){
            return 1;
        }
        return getSum(n-1)+n;
    }

    public static void main(String[] args) {
        test1(5);
//用递归的方法求一到五的和
//        getSum(5)------ > getSum(4) + 5;
//        getSum(4)------ > getSum(3) + 4;
//        getSum(3)------ > getSum(2) + 3;
//        getSum(2)------ > getSum(1) + 2;
//        getSum(1)------>return 1;
        System.out.println("--------------------");
        int sum = getSum(5);
        System.out.println("sum:"+sum);
    }

}

二、面向对象

面向对象思想概述

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

面向对象不是一门编程语言,也不是一种语法,而是一种思想

Java语言是一种面向对象的成程序设计语言,而面向对象,思想是一种程序设计思想,我们在面向对象对象的思想的指引下

使用Java语言去设计,开发计算机程序,这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为,面向对象思想就是在计算程序设计过程中,参照现实中事物,将事物的属性特征,行为特征抽象出来,描述成计算机事物的设计思想,

它区别于没想过程的思想,强调的是通过调用对象的行为实现功能,而不是自己一步一步的去操作实现。

面向过程:关注的是过程,遇到一个问题时候,“我该怎么做”,一步一步实现最终的功能即可

面向对象:关注的是对象,遇到一个问题的时候,“我该让谁来做”,这个谁就是我们要关注的对象。

 

类和对象

环顾四周,你会发现很多对象,比如:桌子,椅子,同学,老师等,桌椅属于办公用品,师生属于人类,那么什么是类呢,?什么是对象呢?

什么是类?。

类:是一组相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述给类事物。

现实中描述一类事物。

属性:就是该事物的状态信息

行为:就是改事物的能够做什么

举例:小猫

属性:名字,体重,年龄,颜色,行为:走,跑,叫

什么是对象

对象:是一类事物的具体体现。对象是一类的一个举例。(对象并不是找女朋友),必然具备改类事物的属性和行为

现实中,一类事物的一个实例:一只小猫

举例:一只小猫

属性:tom,5kg,2years,yellow,.行为:溜墙根走,奔逃的跑,喵喵叫

类和对象的关系

类是对一类事物的描述,是抽象的

对象是一类事物的实例,是具体的

类是对象的模板,对象是类的实体

 

类的定义

构建一个类

    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor

 示例

package com.tuling.part2;

//step1:定义类
public class Person{
/*    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor*/
//    }
    //成员变量
    String name;//姓名
    int age;//年龄
    //......

    //行为:成员方法
    public void eat() {
        //局部变量
        int num = 23;
        System.out.println("吃饭.........");
    }
    public void sleep() {
        System.out.println("感觉.........");
    }

}

创建一个对象

类名 对象名 = new 类名();

使用对象访问类中的成员

对象名,成员变量;
对象名,成员方法(); 

示例

package com.tuling.part2;

public class testPerson {
    public static void main(String[] args) {
//        step2:创建对象
//        类名:对象名 = new 类名();
        Person person = new Person();
//        访问成员变量和成员方法
//        设值
        person.age = 23;
        person.name = "zhangsan";

//        取值
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);
//
        person.eat();
        person.sleep();

//        注意点:成员变量的默认值,,就是上面的如果没有给值也可以直接去访问
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);
    }
}

注意点:

类中成员变量和局部成员变量不同,有默认值

基本类型

int : byte,short ,long,float,double,默认值都是0

char:的默认值“空字符”,也就是‘\u0000’,数值为0;

boolean默认值false;

引用类型,默认值都是null ,空

 

构建函数

 构造方法是一种特殊的方法

1.定义的语法结构不同

【构造权限修饰符】 方法名(参数列表){

}
修饰符:访问权限修饰符
没有返回值类型,也不写void
方法名:必须和类名一致
参数
    没有参数;无参构造
    有参数列表:有参构造

  

示例

Person.java

package com.tuling.part2;

//step1:定义类
public class Person{
/*    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor*/
//    }
    //成员变量
    String name;//姓名
    int age;//年龄
    //......



//    构造函数
    public Person(){//默认提供无参构造方法
        System.out.println("无参构造函数........");
    }
//    创建对象的时候直接给参数赋值
    public Person(int a,String n){
        age = a;
        name = n;
    }

    //行为:成员方法
    public void eat() {
        //局部变量
        int num = 23;
        System.out.println("吃饭.........");
    }
    public void sleep() {
        System.out.println("感觉.........");
    }

}

testPerson.java

package com.tuling.part2;

public class testPerson {
    public static void main(String[] args) {
//        step2:创建对象
//        类名:对象名 = new 类名();
        Person person = new Person();
//        访问成员变量和成员方法
//        设值
        person.age = 23;
        person.name = "zhangsan";

//        取值
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);
//
        person.eat();
        person.sleep();

//        注意点:成员变量的默认值,,就是上面的如果没有给值也可以直接去访问
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);

        System.out.println(".........................");
        Person p2 = new Person(45,"wanglong");
        System.out.println("person对象的姓名:"+p2.name);
        System.out.println("person对象的年龄:"+p2.age);
    }
}

2.调用不同

1.通过new关键字调用
2.new 构造方法();

  

3.作用不同:专门用于创建对象的

注意点:如果一个类中当没有写有参构造方法,那么当创建对象的时候,编译器会自动天剑一个无参的构造方法,如果类中写了构造方法,那么编译器不在自动天剑无参了

 THIS关键字

this代表所在类当前对象的额引用,(地址值)。即对象自己的引用

方法被那个对象调用,方法中的this代表那个对象,即谁在调用,this就代表谁

指在本类的对象可以访问本类的属性和方法

用途一:当局部变量和成员变量冲突的时候,通过this来区分

this 成员变量

  

示例

package com.tuling.part2;

//step1:定义类
public class Person{
/*    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor*/
//    }
    //成员变量
    String name;//姓名
    int age;//年龄
    //......



//    构造函数
    public Person(){//默认提供无参构造方法
        System.out.println("无参构造函数........");
    }
//    创建对象的时候直接给参数赋值
//    public Person(int a,String n){
//        age = a;
//        name = n;
//    }

    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }

    //行为:成员方法
    public void eat() {
        //局部变量
        int num = 23;
        System.out.println("吃饭.........");
    }
    public void sleep() {
        System.out.println("感觉.........");
    }

}
package com.tuling.part2;

public class testPerson {
    public static void main(String[] args) {
//        step2:创建对象
//        类名:对象名 = new 类名();
        Person person = new Person();
//        访问成员变量和成员方法
//        设值
        person.age = 23;
        person.name = "zhangsan";

//        取值
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);
//
        person.eat();
        person.sleep();

//        注意点:成员变量的默认值,,就是上面的如果没有给值也可以直接去访问
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);

        System.out.println(".........................");
        Person p2 = new Person(45,"wanglong");
        System.out.println("person对象的姓名:"+p2.name);
        System.out.println("person对象的年龄:"+p2.age);
    }
}

 

 解决办法就是在成员变量前加一个this就行了

 

 

 

 this第二个用途访问本类的属性和方法

this.属性
this.方法();

  

习惯上可以省略this直接使用属性和方法

比如我们在添加几个成员方法

package com.tuling.part2;

//step1:定义类
public class Person{
/*    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor*/
//    }
    //成员变量
    String name;//姓名
    int age;//年龄
    //......



//    构造函数
    public Person(){//默认提供无参构造方法
        System.out.println("无参构造函数........");
    }
//    创建对象的时候直接给参数赋值
//    public Person(int a,String n){
//        age = a;
//        name = n;
//    }

    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }

    //行为:成员方法
    public void eat() {
        //局部变量
        int num = 23;
        System.out.println("吃饭.........");
    }
    public void sleep() {
        System.out.println("感觉.........");
    }
    public void study(){
//        通过this关键字访问成员变量
        System.out.println(this.name+"在学习");
    }

    public void work(){
//        通过this关键字访问成员方法
        this.study();
        System.out.println("在工作-------");
    }

}
package com.tuling.part2;

public class testPerson {
    public static void main(String[] args) {
//        step2:创建对象
//        类名:对象名 = new 类名();
        Person person = new Person();
//        访问成员变量和成员方法
//        设值
        person.age = 23;
        person.name = "zhangsan";

//        取值
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);
//
        person.eat();
        person.sleep();

//        注意点:成员变量的默认值,,就是上面的如果没有给值也可以直接去访问
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);

        System.out.println(".........................");
        Person p2 = new Person(45,"wanglong");
        System.out.println("person对象的姓名:"+p2.name);
        System.out.println("person对象的年龄:"+p2.age);

        System.out.println("-------------------------------");
        Person person2 = new Person(66,"liyang");
        System.out.println("person2对象的姓名:"+person2.name);
        System.out.println("person2对象的年龄:"+person2.age);

        System.out.println("------------------------------");

        person2.study();
        person2.work();
    }
}

指代构造函数: this();

如果存在多个构造方法,那么this指代的构造方法要靠参数来区分:顺序,个数,类型

注意:this指向构造函数的时候只能放在第一句

示例

package com.tuling.part2;

//step1:定义类
public class Person{
/*    [修饰符] class 类名{
//        1.属性字段,Field
        成员变量
//        2.成员方法,Method
        行为功能
//        3.构建方法:Costructor*/
//    }
    //成员变量
    String name;//姓名
    int age;//年龄
    //......



//    构造函数
    public Person(){//默认提供无参构造方法
        this(23,"lixiaolong");//当我创建对象的时候默认的姓名和年龄
        System.out.println("无参构造函数........");
    }
//    创建对象的时候直接给参数赋值
//    public Person(int a,String n){
//        age = a;
//        name = n;
//    }

    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }

    //行为:成员方法
    public void eat() {
        //局部变量
        int num = 23;
        System.out.println("吃饭.........");
    }
    public void sleep() {
        System.out.println("感觉.........");
    }
    public void study(){
//        通过this关键字访问成员变量
        System.out.println(this.name+"在学习");
    }

    public void work(){
//        通过this关键字访问成员方法
        this.study();
        System.out.println("在工作-------");
    }

}
package com.tuling.part2;

public class testPerson {
    public static void main(String[] args) {
//        step2:创建对象
//        类名:对象名 = new 类名();
        Person person = new Person();
//        访问成员变量和成员方法
//        设值
//        person.age = 23;
//        person.name = "zhangsan";

//        取值
//        System.out.println("person对象的姓名:"+person.name);
//        System.out.println("person对象的年龄:"+person.age);
//
        person.eat();
        person.sleep();

//        注意点:成员变量的默认值,,就是上面的如果没有给值也可以直接去访问
        System.out.println("person对象的姓名:"+person.name);
        System.out.println("person对象的年龄:"+person.age);

        System.out.println(".........................");
        Person p2 = new Person(45,"wanglong");
        System.out.println("person对象的姓名:"+p2.name);
        System.out.println("person对象的年龄:"+p2.age);

        System.out.println("-------------------------------");
        Person person2 = new Person(66,"liyang");
        System.out.println("person2对象的姓名:"+person2.name);
        System.out.println("person2对象的年龄:"+person2.age);

        System.out.println("------------------------------");

        person2.study();
        person2.work();
    }
}

 

 面向对象的三个特性之封装

面向对象有三个特性:封装,继承,多态

 

封装性:尽可能隐藏对象的内部实现细节,控制对象修改及访问权限

面向对象编辑语言是对客观世界的模拟,客观世界的成员变量都是隐藏在对象的内部的,外界无法直接操作和修改

封装可以被认为是一个保护屏障,防止该类的代码和数据被其他的类随意访问,要访问该类的数据,必须通过指定的

方式,适当的封装可以使得代码更容易理解和维护,也加强了代码的安全性

 

1.隐藏了实现的细节

2.提高了代码的复用性

3.提高了安全性

  保护细节

  保护数据的安全

封装步骤:

在类中,属性的数值不安全,所以要将属性进行封装

step1:使用private修饰符来修饰属性,限于本类访问

step2:因为对象对属性的操作,赋值和取值

            我们在类中提供了两个方法,分别用于改属性进行赋值和取值

            赋值的方法setter:setXXX(); 比如setAge(); setName();

            取值的方法setter:getXXX(); 比如getAge();l getName()

访问权限修饰符4个

   public :公共的

   private: 私有的,属性,方法,只能在本类中使用

示例

 

package com.tuling.part2;

public class Student {
    //step1:用访问修饰符修饰成员变量,限于本类变量
    //三个成员变量
    private String stuNo;
    private int age;
    private char sex;

    public Student(){}
    public Student(String stuNo,int age,char sex){
        setStuNo(stuNo);
        setAge(age);
        setSex(sex);
    }

    //step2:提供设置取值相应的方法,setXXX,getXXX
    public void setAge(int age){
        //可以设置setXXX方法当中设置一些规则
        if(age<0){
            System.out.println("设置的参数值不合理,请重新设置!!");
        }
        this.age = age;
    }

    public int getAge(){
        return age;
    }

    public void setStuNo(String stuNo){
        //如果有限制规则,就写上.如果没有限制就直接赋值给变量
        this.stuNo = stuNo;
    }

    public String getStuNo(){
        return stuNo;
    }

    public void setSex(char sex){
        if(sex==''||sex==''){
            this.sex = sex;
        }else{
            System.out.println("sex性别设置不合理请重新设置");
        }
    }
    public char getSex(){
        return sex;
    }

    //成员方法,行为
    public void study(){
        System.out.println("学习.......");
    }

    public void play(){
        System.out.println("玩游戏......");
    }

    //打印自己本身的属性
    public void print(){
        System.out.println("stuNo"+stuNo);
        System.out.println("age"+age);
        System.out.println("sex"+sex);
    }
}
package com.tuling.part2;

public class TestStudent {

    public static void main(String[] args) {
        //1.创建对象
        Student student = new Student();
//        student.stuNo = "001";
//        student.age = 18;
//        student.setAge(2);
//        student.sex = '女';

        student.setStuNo("001");
        student.setAge(18);
        student.setSex('r');
        student.print();

        System.out.println("--------------------------");
        Student stu2 = new Student();
//        stu2.stuNo = "002";
//        stu2.age = 20;
//        stu2.sex = '男';
        stu2.print();
    }
}

 

posted @ 2022-01-05 00:25  来云朋  阅读(56)  评论(0)    收藏  举报