面向对象基础

面向对象概述

面向过程思想及面向对象思想
A:什么是面向过程
面向过程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
例如:吃煎饼果子利用面向过程的思想:
1.学习摊煎饼的技术
2.买材料鸡蛋,油,葱等等
3.开始摊
4.吃
5.收拾
B:什么是面向对象
面向对象思想就是不断的创建对象,使用对象,指挥对象做事情。(如果有对象,直接用对象,对我们直接提供服务)
例如:吃煎饼果子利用面向对象的思想
1. 找会摊煎饼的大妈(创建一个摊煎饼大妈的对象)
2. 调用其摊煎饼的技能(功能),传递进去钱参数
3. 返回给我们一个煎饼
4. 吃

面向过程特点及面向对象特点
A:面向过程:
强调的是过程,所有事情都需要自己完成
B:面向对象:
是一种更符合我们思想习惯的思想(懒人思想,我把事情自己不做,交给别人去做)
可以将复杂的事情简单化(对使用者来说简单了,对象里面还是很复杂的)
将我们从执行者变成了指挥者角色发生了转换

类与对象的概述
A:我们学习编程是为了什么
为了把我们日常生活中实物用学习语言描述出来
B:我们如何描述现实世界事物
属性 就是该事物的描述信息(事物身上的名词)
行为 就是该事物能够做什么(事物身上的动词)
C:Java中最基本的单位是类,Java中用class描述事物也是如此
成员变量 就是事物的属性
成员方法 就是事物的行为
D:定义类其实就是定义类的成员(成员变量和成员方法)
a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
E:类和对象的概念
a:类:是一组相关的属性和行为的集合(我们班所有的同学都具备相同的属性和行为,比如:姓名,年龄,学习,这样就把所有的学生成为学生类)
b:对象:是该类事物的具体体现(说某个同学时,他都具备自己特有的属性和行为)
c:举例
类 学生
对象 具体的某个学生就是一个对象
比如:车是一个类,具体的开的奔驰、宝马,就是对象

学生类案例

* 类的定义:
 *      类是用来描述现实世界的事物的
 * 
 * 事物:
 *      属性  事物的描述信息
 *      行为  事物能够做什么
 * 
 * 类是如何和事物进行对应的呢?
 *      类:
 *          成员变量
 *          成员方法
 * 
 * 需求:写一个学生类
 * 
 * 学生事物:
 *      属性:姓名,年龄...
 *      行为:学习,吃饭...
 * 
 * 学生类:
 *      成员变量:姓名,年龄
 *      成员方法:学习,吃饭
 *
 * 成员变量:和我们前面学习过的变量的定义是一样的。
 *      位置不同:类中,方法外
 *      初始化值:不需要给初始化值
 * 成员方法:和我们前面学习过的方法的定义是一样的。
 *      去掉static关键字
 */
public class Student {
    //成员变量
    //姓名
    String name;
    //年龄
    int age;

    //成员方法
    //学习的方法
    public void study() {
        System.out.println("好好学习,天天向上");
    }

    //吃饭的方法
    public void eat() {
        System.out.println("学习饿了要吃饭");
    }
}


package com.itheima_02;
/*
 * Student是一个学生事物描述类,main方法不适合放在它里面。
 * 
 * 使用一个类,其实就是使用该类的成员。(成员变量和成员方法)
 * 而我们要想使用一个类的成员,就必须首先拥有该类的对象。
 * 我们如何拥有一个类的对象呢?
 *      创建对象就可以了?
 * 我们如何创建对象呢?
 *      格式:类名 对象名 = new 类名();
 * 对象如何访问成员呢?
 *      成员变量:对象名.变量名
 *      成员方法:对象名.方法名(...)
 */
public class StudentDemo {
    public static void main(String[] args) {
        //格式:类名 对象名 = new 类名();
        Student s = new Student();
        //System.out.println("s:"+s); //com.itheima_02.Student@193c0cf

        //直接输出成员变量值
        System.out.println("姓名:"+s.name); //null
        System.out.println("年龄:"+s.age); //0
        System.out.println("----------");

        //给成员变量赋值
        s.name = "林青霞";
        s.age = 28;

        //再次输出成员变量的值
        System.out.println("姓名:"+s.name); //林青霞
        System.out.println("年龄:"+s.age); //28
        System.out.println("----------");

        //调用成员方法
        s.study();
        s.eat();
    }
}

对象的内存图

这里写图片描述

方法公用内存图

这里写图片描述

两个引用指向同一个对象

这里写图片描述

成员变量和局部变量的区别

A:在类中的位置不同
成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)
B:在内存中的位置不同
成员变量:堆内存
局部变量:栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值的问题
成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使用

面向对象的特性:封装

封装与私有关键字

private关键字:
a:是一个权限修饰符。
b:可以修饰成员(成员变量和成员方法)
c:被private修饰的成员只在本类中才能访问。

private最常见应用
a:把成员变量用private修饰
b:提供对应的getXxx()/setXxx()方法

/*
 * 学生类
 */
public class Student {
    private String name;
    private int age;

    public void setName(String n) {
        name = n;
    }

    public String getName() {
        return name;
    }

    public void setAge(int a) {
        age = a;
    }

    public int getAge() {
        return age;
    }
}

/*
 * 学生类的测试类
 */
public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        System.out.println(s.getName()+"---"+s.getAge());

        s.setName("林青霞");
        s.setAge(28);
        System.out.println(s.getName()+"---"+s.getAge());
    }
}

封装的概述和好处

A:封装概述
是面向对象三大特征之一
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。就像刚才说的年龄。

B:封装原则:
将不需要对外提供的内容都隐藏起来。
把属性隐藏,提供公共方法对其访问。
成员变量private,提供对应的getXxx()/setXxx()方法

C:好处:
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性。

this关键字

A:this:代表所在类的对象引用方法被哪个对象调用,this就代表那个对象
B:什么时候使用this呢?
-局部变量和成员变量重名

//学生类
public class Student {
    private String name;
    private int age;

    public void setName(String name) { //"林青霞"
        //name = name;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        //age = age;
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

/*
 * 学生类的测试类
 */
public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        System.out.println(s.getName()+"---"+s.getAge());

        s.setName("林青霞");
        s.setAge(28);
        System.out.println(s.getName()+"---"+s.getAge());
    }
}

面向对象的构造方法

作用
主要用来给对象的数据进行初始化

构造方法格式

a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值

public class Student {  
    public Student() {
        System.out.println("这是构造方法");
    }
}



public class StudentDemo {
    public static void main(String[] args) {
        //如何调用构造方法呢?
        //通过new关键字调用
        //格式:类名 对象名 = new 构造方法(...);
        Student s = new Student();
    }
}

构造方法注意事项与重载

如果你不提供构造方法,系统会给出默认构造方法
如果你提供了构造方法,系统将不再提供
构造方法也是可以重载的,重载条件和普通方法相同

public class Student {
    private String name;
    private int age;

    /*
    public Student() {
        System.out.println("这是构造方法");
    }
    */

    public Student() {}

    public Student(String name) {
        this.name = name;
    }

    public Student(int age) {
        this.age = age;
    }

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

    public void show() {
        System.out.println(name+"---"+age);
    }
}
public class StudentDemo {
    public static void main(String[] args) {
        //如何调用构造方法呢?
        //通过new关键字调用
        //格式:类名 对象名 = new 构造方法(...);
        Student s = new Student();
        s.show();

        //public Student(String name)
        Student s2 = new Student("林青霞");
        s2.show();

        //public Student(int age)
        Student s3 = new Student(28);
        s3.show();

        //public Student(String name,int age)
        Student s4 = new Student("林青霞",28);
        s4.show();
    }
}

包含private,无参,有参构造的标准学生类代码:

/*
 * 学生类
 */
public class Student {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public Student() {}

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

    //成员方法
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

/*
 * 学生类的测试类
 */
public class StudentDemo {
    public static void main(String[] args) {
        //无参+setXxx()
        Student s = new  Student();
        s.setName("林青霞");
        s.setAge(28);
        System.out.println(s.getName()+"---"+s.getAge());

        //带参构造
        Student s2 = new Student("林青霞",28);
        System.out.println(s2.getName()+"---"+s2.getAge());
    }
}

类名作为形参和返回值案例

public class Student {
    public void study() {
        System.out.println("好好学习,天天向上");
    }
}


public class Teacher {

    public Student getStudent() {
        Student s = new Student();
        return s;//返回的是Student对象的地址值
    }
}


//需求: 通过Teacher得到Student对象,然后调用Student类的方法
//如果方法的返回值是类名:其实返回的是该类的对象
public class Test {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        Student s = t.getStudent();
        s.study();
    }
}

Scanner类 与 String类

Scanner类

用Scanner类的方法可以完成接收键盘录入的数据

import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        //接收数据
        System.out.println("请输入一个字符串数据:");
        String s = sc.nextLine();
        //输出结果
        System.out.println("s:"+s);
    }
}

String类

A:”abc”是String类的一个实例,或者成为String类的一个对象
B:字符串字面值”abc”也可以看成是一个字符串对象
C:字符串是常量,一旦被赋值,就不能被改变
D:字符串本质是一个字符数组

String类的构造方法

String(String original):把字符串数据封装成字符串对象
String(char[] value):把字符数组的数据封装成字符串对象
String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象

public class StringDemo {
    public static void main(String[] args) {
        //方式1
        //String(String original):把字符串数据封装成字符串对象
        String s1 = new String("hello");
        System.out.println("s1:"+s1);
        System.out.println("---------");

        //方式2
        //String(char[] value):把字符数组的数据封装成字符串对象
        char[] chs = {'h','e','l','l','o'};
        String s2 = new String(chs);
        System.out.println("s2:"+s2);
        System.out.println("---------");

        //方式3
        //String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象
        //String s3 = new String(chs,0,chs.length);
        String s3 = new String(chs,1,3);
        System.out.println("s3:"+s3);
        System.out.println("---------");

        //方式4
        String s4 = "hello";
        System.out.println("s4:"+s4);
    }
}

创建字符串对象两种方式的区别

这里写图片描述

通过构造方法创建字符串对象是在堆内存。
直接赋值方式创建对象是在方法区的常量池。

==:
基本数据类型:比较的是基本数据类型的值是否相同
引用数据类型:比较的是引用数据类型的地址值是否相同

public class StringDemo2 {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = "hello";

        System.out.println("s1:"+s1);
        System.out.println("s2:"+s2);

        System.out.println("s1==s2:"+(s1==s2)); //false

        String s3 = "hello";
        System.out.println("s1==s3:"+(s1==s3)); //false
        System.out.println("s2==s3:"+(s2==s3)); //true
    }
}

String类的判断功能

boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str):判断字符串对象是否以指定的str开头
boolean endsWith(String str):判断字符串对象是否以指定的str结尾

public class StringDemo {
    public static void main(String[] args) {
        //创建字符串对象
        String s1 = "hello";
        String s2 = "hello";
        String s3 = "Hello";

        //boolean equals(Object obj):比较字符串的内容是否相同
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println("-----------");

        //boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
        System.out.println(s1.equalsIgnoreCase(s2));
        System.out.println(s1.equalsIgnoreCase(s3));
        System.out.println("-----------");

        //boolean startsWith(String str):判断字符串对象是否以指定的str开头
        System.out.println(s1.startsWith("he"));
        System.out.println(s1.startsWith("ll"));
    }
}

String类的获取功能

int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
String substring(int start):从start开始截取字符串
String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end

public class StringDemo {
    public static void main(String[] args) {
        //创建字符串对象
        String s = "helloworld";

        //int length():获取字符串的长度,其实也就是字符个数
        System.out.println(s.length());
        System.out.println("--------");

        //char charAt(int index):获取指定索引处的字符
        System.out.println(s.charAt(0));
        System.out.println(s.charAt(1));
        System.out.println("--------");

        //int indexOf(String str):获取str在字符串对象中第一次出现的索引
        System.out.println(s.indexOf("l"));
        System.out.println(s.indexOf("owo"));
        System.out.println(s.indexOf("ak"));
        System.out.println("--------");

        //String substring(int start):从start开始截取字符串
        System.out.println(s.substring(0));
        System.out.println(s.substring(5));
        System.out.println("--------");

        //String substring(int start,int end):从start开始,到end结束截取字符串
        System.out.println(s.substring(0, s.length()));
        System.out.println(s.substring(3,8));
    }
}

遍历字符串

ublic class StringTest {
    public static void main(String[] args) {
        //创建一个字符串对象
        String s = "abcde";
        //用for循环改进
        for(int x=0; x<5; x++) {
            System.out.println(s.charAt(x));
        }
        System.out.println("---------");

        //用length()方法获取字符串的长度
        for(int x=0; x<s.length(); x++) {
            System.out.println(s.charAt(x));
        }
    }
}

统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)

public class StringTest2 {
    public static void main(String[] args) {
        //键盘录入一个字符串数据
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串数据:");
        String s = sc.nextLine();
        //定义三个统计变量,初始化值都是0
        int bigCount = 0;
        int smallCount = 0;
        int numberCount = 0;
        //遍历字符串,得到每一个字符
        for(int x=0; x<s.length(); x++) {
            char ch = s.charAt(x);
            //拿字符进行判断
            if(ch>='A' && ch<='Z') {
                bigCount++;
            }else if(ch>='a' && ch<='z') {
                smallCount++;
            }else if(ch>='0' && ch<='9') {
                numberCount++;
            }else {
                System.out.println("该字符"+ch+"非法");
            }
        }
        //输出结果
        System.out.println("大写字符:"+bigCount+"个");
        System.out.println("小写字符:"+smallCount+"个");
        System.out.println("数字字符:"+numberCount+"个");
    }
}

String类的转换功能

char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串

public class StringDemo {
    public static void main(String[] args) {
        //创建字符串对象
        String s = "abcde";

        //char[] toCharArray():把字符串转换为字符数组
        char[] chs = s.toCharArray();
        for(int x=0; x<chs.length; x++) {
            System.out.println(chs[x]);
        }
        System.out.println("-----------");

        //String toLowerCase():把字符串转换为小写字符串
        System.out.println("HelloWorld".toLowerCase());
        //String toUpperCase():把字符串转换为大写字符串
        System.out.println("HelloWorld".toUpperCase());
    }

键盘录入一个字符串,把该字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)

public class StringTest {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();

        //截取首字母
        String s1 = s.substring(0, 1);

        //截取除了首字母以外的字符串
        String s2 = s.substring(1);

        //B转大写+C转小写
        String s3 = s1.toUpperCase()+s2.toLowerCase();

        //输出即可
        System.out.println("s3:"+s3);
    }
}

把数组中的数据按照指定个格式拼接成一个字符串

public class StringTest {
    public static void main(String[] args) {
        //定义一个int类型的数组
        int[] arr = {1,2,3};

        //写方法实现把数组中的元素按照指定的格式拼接成一个字符串

        //调用方法
        String s = arrayToString(arr);

        //输出结果
        System.out.println("s:"+s);
    }


    public static String arrayToString(int[] arr) {
        String s = "";

        //[1, 2, 3]
        s += "[";
        for(int x=0; x<arr.length; x++) {
            if(x==arr.length-1) {
                s += arr[x];
            }else {
                s += arr[x];
                s += ", ";
            }
        }
        s += "]";
        return s;
    }
}

字符串反转

public class StringTest2 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();

        //写方法实现字符串的反转

        //调用方法
        String result = reverse(s);

        //输出结果
        System.out.println("result:"+result);
    }



    /*
     * 把字符串倒着遍历,得到的每一个字符拼接成字符串。
    /*
    public static String reverse(String s) {
        String ss = "";
        for(int x=s.length()-1; x>=0; x--) {
            ss += s.charAt(x);
        }
        return ss;
    }
    */

    //把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
    public static String reverse(String s) {
        //把字符串转换为字符数组
        char[] chs = s.toCharArray();

        //对字符数组进行反转
        for(int start=0,end=chs.length-1; start<=end; start++,end--) {
            char temp = chs[start];
            chs[start] = chs[end];
            chs[end] = temp;
        }
        //最后在把字符数组转换为字符串
        String ss = new String(chs);
        return ss;
    }
}

StringBuilder类

概述

StringBuilder:是一个可变的字符串。字符串缓冲区类。
String和StringBuilder的区别:
String的内容是固定的
StringBuilder的内容是可变的

+=拼接字符串耗费内存原因

每次拼接都会产生新的字符串对象,而利用StringBuilder来拼接字符串自始至终用的都是同一个StringBuilder容器

这里写图片描述

StringBuilder类的常用方法

A:构造方法:
StringBuilder()

B:成员方法:
public int capacity():返回当前容量 (理论值)
public int length():返回长度(已经存储的字符个数)
public StringBuilder append(任意类型):添加数据,并返回自身对象

/*
 * StringBuilder:是一个可变的字符串。字符串缓冲区类。
 * 
 * String和StringBuilder的区别:
 *      String的内容是固定的。
 *      StringBuilder的内容是可变的。
 * 
 * 构造方法:
 *      StringBuilder()
 * 
 * 成员方法:
 *      public int capacity():返回当前容量
 *      public int length():返回长度(字符数)
 * 
 *      容量:理论值
 *      长度:实际值
 */
public class StringBuilderDemo {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();
        System.out.println("sb:"+sb);
        System.out.println("sb.capacity():"+sb.capacity());
        System.out.println("sb.length():"+sb.length());
    }
}
/*
 * 添加功能
 *      public StringBuilder append(任意类型):添加数据,并返回自身对象
 * 反转功能
 *      public StringBuilder reverse()
 */
public class StringBuilderDemo {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();

        //public StringBuilder append(任意类型)
        //StringBuilder sb2 = sb.append("hello");

        /*
        System.out.println("sb:"+sb);
        System.out.println("sb2:"+sb2);
        System.out.println(sb == sb2); //true
        */

        /*
        sb.append("hello");
        sb.append("world");
        sb.append(true);
        sb.append(100);
        */

        //链式编程
        sb.append("hello").append("world").append(true).append(100);

        System.out.println("sb:"+sb);

        //public StringBuilder reverse()
        sb.reverse();
        System.out.println("sb:"+sb);

    }
}

StringBuilder和String通过方法完成相互转换

/*
 * StringBuilder和String的相互转换
 * 
 * StringBuilder -- String
 *      public String toString():通过toString()就可以实现把StringBuilder转成String
 * 
 * String -- StringBuilder
 *      StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder
 */
public class StringBuilderTest {
    public static void main(String[] args) {
        String s = "helloworld";
        StringBuilder sb = new StringBuilder(s);
        System.out.println(sb);
    }
}

利用StringBuilder把数组拼接成一个字符串

public class StringBuilderTest2 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {1,2,3};

        //写方法实现拼接

        //调用方法
        String s = arrayToString(arr);

        //输出结果
        System.out.println("s:"+s);
    }

    public static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder();
        //[1, 2, 3]
        sb.append("[");
        for(int x=0; x<arr.length; x++) {
            if(x==arr.length-1) {
                sb.append(arr[x]);
            }else {
                sb.append(arr[x]).append(", ");
            }
        }
        sb.append("]");

        String result = sb.toString();

        return result;
    }

利用StringBuilder完成字符串反转

public class StringBuilderTest3 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();

        //写方法实现反转

        //调用方法
        String result = myReverse(s);

        //输出结果
        System.out.println("result:"+result);
    }


    public static String myReverse(String s) {
        //String -- StringBuilder -- reverse() -- String
        StringBuilder sb = new StringBuilder(s);
        sb.reverse();
        String result = sb.toString();
        return result;
    }
}

判断一个字符串是否是对称字符串

public class StringBuilderTest4 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();

        //写方法实现判断一个字符串是否是对称字符串

        //调用方法
        boolean b = isSymmetry(s);

        //输出结果
        System.out.println("b:"+b);
    }

    public static boolean isSymmetry(String s) {
        //把字符串反转,和反转前的字符串进行比较,如果内容相同,就说明是对称字符串
        StringBuilder sb = new StringBuilder(s);
        sb.reverse();
        String result = sb.toString();

        return result.equals(s);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值