JavaSE基础复习二:面向对象
本文最后更新于:2021年7月23日 晚上
JavaSE基础复习二:面向对象
类和对象
类是Java程序的基本组成单位
类是对现实生活中异类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为
类的组成:属性和行为
属性:成员变量(实例)
行为:成员方法(实例)类方法可以共用
变量的类型:
类变量(静态变量:static)
成员变量(实例变量):堆中,随对象存在,有初始值
局部变量(本地变量):栈,方法调用结束消失,没有初始值
this关键字:指向调用的对象
封装
原则:隐藏某些信息在类内部,不允许外部程序直接访问,对外提供Setter和Getter方法。
优点:提高代码安全性,提高代码复用性
构造方法:
无参构造:如果没有写构造方法,系统默认提供一个无参构造方法
有参构造方法:当存在有参构造,系统不再提供无参构造方法,当需要使用无参构造时,需要自己写一个无参构造方法,因此推荐都手动写一个无参构造方法。
API
IDEA:Ctrl+Alt+v,补全返回值声明。例如:
nextLine();
按快捷键,自动补全为String line = nextLine();
Java官方提供的API文档:https://docs.oracle.com/en/java/javase/11/docs/api/index.html
String
内容不可变,加操作会用StringBuilder操作
在
java.lang
包下,不需要导入所有”被引起来的字符串”最终都被实现为此类的实例
创建后值不能被更改,但是可以被共享
底层原理是字节数组(byte[])
常见构造方法:
函数 功能 public String() 创建一个空白字符串对象,不含有任何内容 public String(char[] args) 根据字符数组的内容,来创建字符串对象 public String(byte[] bys) 根据自己数组的内容,来创建字符串对象 String str = “abc” 直接赋值(推荐) 特点:
每次new申请一个新空间,地址值不同
直接赋值的方式给出的字符串,只要字符序列相同,无论在程序中出现几次,JVM都只会建立一个String对象,并在字符串池中维护,是同一个对象。
字符串比较
用
==
进行比较:基本类型:比较数据值是否相同
引用类型:比较地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现:
equals()
1
public boolean equals(Object anObject)
常用方法:
charAt()
length()
toChartArray()
endsWith()
split()
StringBuilder
构造方法:无参、传入String
方法:
append(元素),返回对象本身
reverse(),返回相反的字符序列
toString()
集合基础:ArrayList
常见使用方法:
方法名 说明 public ArrayList() 创建空集合 public boolean add(E e) 在末尾添加元素,返回添加是否成功 public void add(int index, E e) 在索引index处添加元素 public boolean remove(Object o) 删除指定的元素,返回删除是否成功 public E remove(int index) 删除指定处的元素,返回被修改的元素 public E get(int index) 返回指定索引处的元素 public int size() 返回集合中的元素个数 如果
List<Integer> list = new ArrayList<Integer>
,要用remove方法删除元素1,那么:list.remove((Object)1)
继承
面向对象三大特征:封装、继承、多态
子类继承父类属性和方法,再进行属性和方法的扩充
public class 子类 extends 父类{}
Java只有单继承
extends
,接口可以多继承implements
优缺点
好处:
提高复用性
提高维护性
坏处:
- 类之间产生关系,耦合性增强
变量使用:优先使用局部变量,如果没有去子类中找,没有去父类找,父类中也没有则报错
suger关键字:代表父类存储空间的表示(可以理解为父类对象的引用),用于访问父类的属性或方法。调用构造方法
super()
,子类自己可以用this()
子类初始化一定先初始化父类(子类可能会使用父类的属性和方法),子类构造函数第一句话一定是:
super()
,没写编译器自动添加,如果手动调用super的有参构造,则不会自动添加无参构造。方法重写:
子类中出现了和父类一样的方法声明
当子类需要父类的功能,但功能主题子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父亲的功能,又定义了子类特有的内容注解
@Override,用来表示重写了父类方法
重写了,默认访问子类方法,若没有重写,默认调用父类的方法
重写时,方法的访问权限不能更低,但可以更高,私有不可重写
修饰符
package:包就是文件夹,用于对类进行分类管理
- 手动建包,自己手动建立几个文件夹,将java文件编译后的class文件放入建立的包路径下,然后运行时候,在包外,命令行带包运行,例如:
java com.quosimodo.HelloWorld
即可。可以用javac -d HelloWorld.java
,它会自动把class文件放进包里,然后直接运行即可。
- 手动建包,自己手动建立几个文件夹,将java文件编译后的class文件放入建立的包路径下,然后运行时候,在包外,命令行带包运行,例如:
权限修饰符:
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。说明:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法(多态,super等访问)。
我们可以通过以下表来说明访问权限:
修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包 public
Y Y Y Y Y protected
Y Y Y 见上说明 N default
Y Y Y N N private
Y N N N N 访问控制和继承
请注意以下方法继承的规则:
父类中声明为 public 的方法在子类中也必须为 public。
父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
父类中声明为 private 的方法,不能够被继承。
final:可以修饰类和方法和变量
final修饰的类不可被继承
final修饰的方法不可被重写
final修饰的变量:
修饰基本类型,表示常量,不可改变
修饰引用类型,地址不能变,但指向的内存里的值可变(即当调用内部的方法是,内部的值是可以改变的)
static:说明是静态的,可以修饰成员方法、成员变量
修饰变量:表示类变量,被所有对象共享,可以直接调用(如果权限允许)
修饰成员方法:表示类方法,被所有对象共享,可以直接调用
JVM加载类时,静态的变量方法会被自动分配空间,不需要new对象就能使用
静态方法只能访问静态成员和静态方法,普通方法都静态和普通方法都能访问
多态
前提:
有继承/实现关系
有方法重写
有父类引用指向子类对象
访问特点:
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边(因为方法可以重写,而变量不能)
父类引用指向子类实例:
无法访问父类没有的变量和方法。
方法被重写了则调用子类的方法,否则调用父类的方法。
变量无论子类是否定义了父类相同的,只要是父类引用调用,一定是父类的,没有则报错。
向上转型直接赋值,向下转型,强制类型转换
抽象类
用
abstract
修饰的类称为抽象类,修饰方法则该方法为抽象方法一个没有方法体,只有声明的方法应该定义为抽象方法
抽象类不能用
protected
或private
或final
修饰抽象方法不能被
final
修饰抽象类中可以没有抽象方法
类中有抽象方法,那么该类一定是抽象类
抽象类不能创建实例,但可以建立引用(抽象类多态,实例化子类)
抽象类用于让子类继承,子类必须重写所有抽象方法,不然该类依然是抽象类
抽象类的成员特点:
抽象类中可以有变量和常量,静态的常量也可以
可以有构造方法,但是不能实例化,用于实例化子类
可以有抽象方法和非抽象方法
接口
interface修饰的类,不能实例化,必须被继承(接口多态)
所有方法都必须重写
用implements继承,类和接口都可以多继承接口,类可以同时继承一个类和多个接口
接口的成员特点:
变量默认被
static final
修饰,所以只有静态常量方法默认被
public abstract
修饰,所以只有抽象方法没有构造方法
接口和抽象类的区别
抽象类 | 接口 | |
---|---|---|
成员 | 常量、变量、构造方法、普通方法、抽象方法 | 常量、抽象方法 |
关系 | 单继承 | 单继承、多继承 |
设计概念 | 对类抽象,包括行为和属性 | 对行为抽象 |
一般共有的的属性和方法用抽象类表示,而有些有,有些没有的行为则用接口实现,可以实现灵活的扩充。
形参和返回值
基本类型做形参和返回值:略
引用类型做形参和返回值
类作为形参:传入该类(或子类)对象
类做返回值:返回该类(或子类)对象
内部类
在类的内部在定义类
1
2
3
4
5
6public class ExternalClass {
// 外部类
修饰符 class InternalClass {
// 内部类
}
}访问特点
内部类可以访问外部类的所有成员,包括私有
外部类要访问内部类的成员,必须创建内部类对象
分为:
成员内部类:在类的成员位置
在类的成员位置定义
使用格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
规范:Outer.Inner oi = new Outer().new Inner();
使用一般定义为private,然后在外部类定义函数对内部类新建对象进行访问
局部内部类:在方法里定义的类
可以使用局部定义的变量或常量和外部类的成员。
匿名内部类:本质是一个对象
前提:存在一个雷或者接口,这里的类可以是具体类也可以是抽象类
本质:一个继承了类或实现了接口的匿名对象
目的:省略定义一个类的定义过程,直接重写方法生成该类对象,适合于一次性使用的类
使用格式
1
2
3new 类名或接口名() {
重写方法;
};// 示例
1
2
3
4
5new Inner() {
public viod show() {
}
};使用方法:
在使用一个方法时:
需要传入一个继承了某个类并重写某个方法的类的对象
或者需要传入一个实现了某个接口实现了某个方法的对象,这时不需要去创建一个类,再创建一个实例,直接用匿名内部类就可以简写。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!