Java关卡九面向对象三大特征

一、封装

1.封装的概述

(1)封装是面向对象的三大特征之一(封装、继承、多态)

(2)面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接擦操作的

2.封装的原则

        将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()方法/setXxx()方法(获取成员变量的值和设置成员变量的值)

3.封装的好处

(1)通过方法来控制成员变量的操作,提高了代码的安全性

(2)把代码用方法进行封装,提高了代码的复用性

4.构造方法

(1)作用:创建对象

(2)功能:完成对象的初始化

(3)格式:修饰符 类名(参数){     }        //修饰符一般用public

(4)构造方法的主意事项:

①构造方法的创建

        如果没有定义构造方法,系统将给出一个默认的无参数构造方法;

        如果定义了构造方法,系统将不再提供默认的构造方法;

②构造方法的重载

        如果自定义了带参数构造方法,还要使用无参数构造方法,就必须在写一个无参数构造方法

③推荐使用方式

        无论是否使用,都手工书写无参数构造方法

Java关卡九面向对象三大特征_第1张图片

(5)标准类制作

 ①成员变量

        使用private修饰

②构造方法

        提供一个无参构造方法

        提供一个带多个参数的构造方法

③成员方法

        提供每一个成员变量对应的setXxx()/getXxx()

        提供一个显示对象信息的show()

④创建对象并为其成员变量赋值的两种方式

        无参数构造方法的创建对象后使用setXxx()赋值

        使用带参构造方法直接创建带有属性值的对象

(一)API

1.API概述:应用程序编程接口(指的就是jdk中提供的各种功能的Java类)

2.快捷键:ctrl+ait+v

(二)String

1.String的概述:代表字符串;

2.字符串特点:

(1)字符串不可变,它们的值在创建后不能更改

(2)虽然String的值不可改变,但是它们可以被共享

(3)字符串效果相当于字符串数组(char[]),但是底层原理是字节数组(byte[])

3.String常见构造方法

方法名 说明
public String() 创建一个空白字符串对象,不含有任何内容
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
public String(byte[] bys) 根据字节数组的内容,来创建字符串对象
String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc

4.String对象的特点:

Java关卡九面向对象三大特征_第2张图片

 5.字符串的比较

(1)使用==作比较

①基本类型:比较的是数据值是否相同

②引用类型:比较的是地址是否相同

(2)字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()   返回的是一个布尔值

①public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串

6.遍历字符串

(1)需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

(2)思路:

①键盘录入字符串,用Scanner实现

②遍历字符串,首先能够获取到字符串中的每一个字符

        public char charAt( int idex );返回指定索引处的char值,字符串的索引也是从0开始的

③遍历字符串,其次要能够获取到字符串的长度

        public int length():返回此字符串的长度

        数组的长度:数组名,.length

        字符串的长度:字符串对象.length()

④遍历字符串的通用格式

for (int i= 0;i

        s.charAt(i);//就是指定索引处的字符值

}

7.统计字符次数

(1)需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

(2)思路:

① 键盘录入一个字符串,用 Scanner 实现

②要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
③遍历字符串,得到每一个字符
④判断该字符属于哪种类型,然后对应类型的统计变量+1

假如ch是一个字符,我要判断它属于大写字母,小写字母,还是数字,直接判断该字符是否在对应的范围即可
            大写字母:ch>='A' && ch<='Z'
            小写字母: ch>='a' && ch<='z'
            数字: ch>='0' && ch<='9'

⑤输出三种类型的字符个数

 //遍历字符串,得到每一个字符
        for(int i=0; i='A' && ch<='Z') {
                bigCount++;
            } else if(ch>='a' && ch<='z') {
                smallCount++;
            } else if(ch>='0' && ch<='9') {
                numberCount++;
            }
        }
方法名 说明
public boolean equals(Object anObject) 比较字符串的内容,严格区分大小写(用户名和密码)
public char charAt(int index) 返回指定索引处的 char 值
public int length() 返回此字符串的长度

(三)StringBuilder

1.概述:StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的

2.StringBuilder与String的区别

  • String类:内容是不可变的

  • StringBuilder类:内容是可变的

3.StringBuilder构造方法

  • 方法名 说明
    public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
    public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象

4.StringBuilder的添加和反转方法

  • 方法名 说明
    public StringBuilder append(任意类型) 添加数据,并返回对象本身
    public StringBuilder reverse() 返回相反的字符序列

//public StringBuilder append(任意类型):添加数据,并返回对象本身

  sb.append("hello").append("world").append("java").append(100);

  //public StringBuilder reverse():返回相反的字符序列

 sb.reverse();

5.StringBuilder与String的相互转换

  • StringBuilder转换为String

    public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

  • String转换为StringBuilder

    public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

StringBuilder sb = new StringBuilder();
        sb.append("hello");

//public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
        String s = sb.toString();

 //String 转换为 StringBuilder
        String s = "hello";

//public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
        StringBuilder sb = new StringBuilder(s);

6.数组字符串拼接

        首先创建一个StringBuilder 的sb对象;

        用sb.append接收for循环获得的数组中的元素

        最后把结果转换为String类型输出;

        Stiring s=sb.toString();

        sout(s);

nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。

7.键盘录入字符串的反转

Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();

//        StringBuilder sb = new StringBuilder(s);
//        sb.reverse();
//        String ss = sb.toString();
//        return ss;

       return new StringBuilder(s).reverse().toString();

二、继承

(一)概要

1.继承的概述: 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法

2.继承格式:public class 子类名 extend 父类名{}

(1)范例:public class Zi extend Fu  {}

(2)Fu:是父类,也称为基类、超类

(3)Zi:是子类,也称为派生类

3.继承中子类的特点:

(1)子类可以有父类的内容

(2)子类还可以有自己特有的内容

4.继承的好处:
(1)提高了代码的复用性(多个类中相同的成员可以放到同一个类中)

(2)提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中的成员

5.继承的弊端

(1)继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也不得不跟着改变,消弱了子类的独立性

6.什么时候使用继承

(1)继承体现的关系: is a(什么是什么的一种)

(2)假设法:我有两个类A和B,如果他们满足A是B的一种,或者是B是A的一种,就说明它们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承

(3)例:苹果和水果;(苹果是水果的一种,就可以把水果设为父类,苹果设为子类)

动物和猫(动物为父类,猫为子类);猫和狗就不能使用继承

(二)继承中成员访问特点

1.继承中变量的访问特点

①首先在子类的局部范围查找(使用的方法中 ,形参)

②在子类的成员变量中查找(子类定义的全局变量,实参)

③父类成员范围中找(父类的成员变量)

④如果父类成员变量中不存在就会报错(不考虑父类的父类)

2.super 

(1)super关键字的用法和this的用法相似

①this:代表本类中的引用(修饰本类中的成员变量引用)

②super:代表父类存储空间的标识(可以理解为父类对象的引用)(修饰父类中成员变量的引用)

(2)成员变量:

①this.成员变量 - 访问本类成员变量

② super.成员变量-访问父类成员变量

(3)成员方法:

①this.成员方法-访问本类成员方法

②super.成员方法-访问父类成员方法

(4)构造方法:

①this(...)-访问本类构造方法

②super(...)-访问父类构造方法

3.继承中构造方法的特点

(1)注意:子类中所有的构造方法默认都会访问父类中无参的构造方法

       子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()

(2)如果想使用父类中带参构造方法就必须使用:super(参数)显示去调用父类的带参构造方法

super()优先访问父类

4.继承中成员方法的访问特点

(1)通过子类对象访问一个方法

①子类成员范围找

②父类成员范围找

③如果都没有就报错(不考虑父亲的父亲…)

5.super内存图

Java关卡九面向对象三大特征_第3张图片

  6.方法的重写

(1)方法重写:子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)

(2)方法重写的应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容(重写后使用父类中的方法用super.方法名(参数名)使用父类中同名的方法 )

(3)Override注解:用来检测当前的方法,是否是重写的方法,起到【校验】的作用

@Override注解是一个注解;可以帮助我们检查重写方法的方法声明的正确性。

(4)重写的注意事项:

①父类中私有的不能被重写(private声明的)

② 子类方法访问权限不能更低(public > 默认 > 私有)

 7.继承的注意事项:

①Java中类只支持单继承,不支持多继承

错误范例:class A extends B, C { }

②Java中类支持多层继承

(三)修饰符

1.包:包就是文件夹,用来管理类文件的

2.包的定义格式:package 包名; (多级包用.分开)

3.导包:类与测试类不在同一个包中,先要进行导包:import 包名.类名; (在测试类中导入需要的类)

4.权限修饰符:

Java关卡九面向对象三大特征_第4张图片

 5.状态修饰符:final(最终态),static(静态)

(1)fianl关键字的作用:final代表最终的意思,可以修饰成员方法,成员变量,类

(2)fianl修饰类:该类不能被继承(不能有子类,但是可以有父类)

(3)final修饰方法:该方法不能被重写

(4)final修饰变量:表明该变量是一个常量,不能再次赋值

(5)fianl修饰基本数据类型变量:final 修饰指的是基本类型的数据值不能发生改变

(6)final修饰引用数据类型变量:final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的

public static void main(String[] args){
    final Student s = new Student(23);
      s = new Student(24);  // 错误
     s.setAge(24);  // 正确
}

6.static修饰:static关键字是静态的意思,可以修饰【成员方法】,【成员变量】

(1)static修饰的特点:

① 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件

②可以通过类名调用当然,也可以通过对象名调用【推荐使用类名调用】

(2)非静态的成员方法

①能访问静态的成员变量

②能访问非静态的成员变量

③能访问静态的成员方法

④能访问非静态的成员方法

(3)静态的成员方法

①能访问静态的成员变量

②能访问静态的成员方法

  • 静态成员方法只能访问静态成员

三、多态

1.多态概述:同一个对象,在不同时刻表现出来的不同形态;

2.多态的前提和体现:

(1)有继承/或实现关系

(2)有方法重写

(3)有父类引用指向子类对象

动物 animal=new 猫();

3.多态中成员访问的特点: 

(1)成员变量:编译看左边,执行也看左边

(2)成员方法:编译看左边,执行看右边

原因:方法有重写,变量没有重写

 4.多态的好处与弊端

(1)好处:提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

(2)弊端:不能使用子类的特有成员

5.多态中的转型

 (1)向上转型:从子到父,父类引用指向子类对象

(2)向下转型:从父到子,父类引用转为子类对象

6.多态内存图解:

Java关卡九面向对象三大特征_第5张图片

 

你可能感兴趣的:(java)