Java学习(四)
第四章 面向对象基础
4.1 什么是面向对象
面向对象的核心思想是重用性和灵活性(灵活性包括可扩展性和变化性)。
4.2 类与对象
4.2.1 类与对象的关系
对象的特征:属性(对象的静态特征)、方法(对象的动态特征)。
类是产生对象的模板。所有的对象都是通过类来创建的。
4.2.2 定义类
基本语法:
public class 类名{
//定义属性,属性名符合驼峰式命名法
public 数据类型 属性名;
//定义方法,方法名符合驼峰式命名法
public 返回值类型 方法名(参数列表){
//方法体
}
}
无返回值时,用void修饰其返回值类型。
4.2.3 构造函数
构造函数的方法名与类名必须一致,不需要定义返回值类型。
public class User {
//定义属性
public int id;
public String name;
public char gender;
public String password;
//无参构造函数
//public User(){}
//有参构造函数
public User(int id, String name, char gender, String password){
this.id = id;
this.name = name;
this.gender = gender;
this.password = password;
}
}
4.2.4 创建对象
创建对象需要调用对应类的构造函数。
public class Text {
public static void main(String[] args){
//创建一个对象
//User user = new User();
//user.id = 1;
//user.name = "张三";
//user.gender = '男';
//user.password = "root";
//边创建变赋值
User user = new User(1, "张三", '男', "root");
}
}
4.2.5 使用对象
对象的使用包括获取和修改属性,以及调用方法。
//......
//边创建变赋值
User user = new User(1, "张三", '男', "root");
System.out.println("用户姓名:" + user.name);
user.id = 2;
System.out.println("用户编号:" + user.id);
}
}
4.2.6 this关键字
通过this可以调用当前类的属性和方法。
类中的方法可以分为:构造方法和普通方法。调用构造函数的语法是“this(参数列表);”,不能在普通方法中使用this来调用构造函数,调用普通方法的语法是“this.方法名(参数列表)”,在构造方法中可以使用this来调用普通方法。
4.2.7 方法重载
什么条件可以构成方法重载:
- 同一个类中;
- 方法名相同;
- 参数列表不同(个数或类型不同);
- 与返回值和访问权限修饰符无关。
public class Test {
public static void main(String[] args){
Test test = new Test();
test.method();
test.method(10);
}
public void method(){
System.out.println("没有参数!");
}
public void method(int num){
System.out.println("参数为:" + num);
}
}
4.2.8 成员变量和局部变量
定义在方法外叫做成员变量
定义在方法内叫做局部变量
同名变量,在方法内可以用this.变量名 进行调用
public class Test {
String name0;
byte name1;
int name2;
short name3;
long name4;
double name5;
float name6;
char name7;
boolean name8;
public void show(){
System.out.println(name0);
System.out.println(name1);
System.out.println(name2);
System.out.println(name3);
System.out.println(name4);
System.out.println(name5);
System.out.println(name6);
System.out.println(name7);
System.out.println(name8);
}
public static void main(String[] args){
Test test = new Test();
test.show();
}
}
//0
//0
//0
//0
//0.0
//0.0
//
//false
4.3 封装
4.3.1 什么是封装
对外部传来的值进行筛选,合格的赋值,不合格的加以处理的过程叫做封装。
封装是指将类的属性隐藏在内部,外部不能直接访问和修改,必须通过类提供的方法来完成对属性的访问和修改。封装的核心思想就是尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。
4.3.2 封装的步骤
- 修改属性的访问权限;
- 提供外部可以直接调用的方法;
- 在方法中加入属性控制逻辑。
访问权限值得是该属性可以被直接访问的范围,实在属性定义是设定的。
public 表示访问权限为共有,外部可以直接访问。
private 表示访问权限为私有,只能在类内部访问。
4.3.3 static关键字
static表示静态或全局,可以用来修饰成员变量和成员方法以及代码块。
用static修饰的成员变量叫做静态变量也叫做类变量,修饰的成员方法叫做静态方法也叫作类方法。
没有被static修饰的成员变量叫实例变量,没有被static修饰的成员方法叫实例方法。
静态方法中不能使用this关键字,不能直接访问所属类的实例变量和实例方法,可直接访问类的静态变量和静态方法。
static除了可以修饰成员变量和成员方法之外,还可以修饰代码块,被static修饰的代码块叫作静态代码块。静态代码块的特点是只执行一次,在什么时候执行呢?当该类被加载到内存时执行,不需要手动调用,它会自动执行,在什么时候类第一次被加载?这里我们需要简单地阐述一下Java加载类的机制。我们知道Java代码是由类构成的,但是真正运行时是通过对象和对象之间的相互调用关系来完成需求的。即程序运行时,需要在内存中创建多个对象,对象怎么创建?需要通过类来创建,类是模板,同时这个模板只需要加载一次,所以程序在运行时,首先会将程序中用到的类加载到内存中,并且只加载一次。然后通过类来创建多个对象以完成具体的业务。被加载到内存中的类叫作运行时类,静态代码块就是在加载类的时候执行的,因为类只加载一次,所以静态代码块也只执行一次。简单理解,当代码中第一次出现某个类时,就会执行静态代码块,静态代码块只能访问静态变量和静态方法,
4.4 继承
4.4.1 什么是继承
一个类继承另一个类的属性和方法的方式叫做继承。被继承的类叫做父类,继承的类叫做自类。
父类:
public class 类名{
//属性和方法
}
自类:
public class 类名 extends 父类名{
//子类特有的属性和方法
}
java只支持单继承。
4.4.2 子类访问父类
在创建子类对象时,无论调用无参构造还是有参构造,都会默认先创建父类对象,并且是通过父类的无参构造完成实例化的。
super(参数)以调用父类的有参结构。
super()以调用父类的无参结构。
访问属性:super.属性名
调用普通方法:super.方法名()
4.4.3 子类访问权限
同一个类 | 同一个包 | 不同包 | 子类 | |
---|---|---|---|---|
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 不可以访问 | 可以访问 |
默认修饰符 | 可以访问 | 可以访问 | 不可以访问 | 不可以访问 |
private | 可以访问 | 不可以访问 | 不可以访问 | 不可以访问 |
包(package)的作用:
- 管理Java类,便于查找和使用相应的文件;
- 区分同名的类,防止命名冲突;
- 实现访问权限限制。
包的命名规范:包名有小写字母组成,不能以.开头或结尾。包名一般有小写字母组成,可以包含数组,但不能以数字开头,使用“.”来分层,命名方式一般采用网络域名的反向输出。在一个类中调用不同包的类时,需要使用import关键字导入该类,语法:improt 包名.类名
4.4.4 方法重写
子类在继承父类方法的基础上,对父类方法重新定义并覆盖的操做叫做方法重写。
方法重写的规则:(1)父子类的方法名相同;(2)父子类的方法参数列表相同;(3)子类方法返回值与父类方法返回值类型相同或者是其子类。(4)子类方法的访问权限不能小于父类。
子类的访问权限必须大于或等于父类。访问权限修饰符public>protected>默认修饰符>private。父类与子类的方法需要一致,父类的私有方法不能被子类重写。
4.4.4 方法重写VS方法重载
所在位置 | 方法名 | 参数列表 | 返回值 | 访问权限 | |
---|---|---|---|---|---|
方法重写 | 子类 | 相同 | 相同 | 相同或是子类 | 不能小于父类 |
方法重载 | 同一个类 | 相同 | 不同 | 没有要求 | 没有要求 |
4.5 多态
4.5.1 什么是多态
多态是父类对子类的多种表现形式,体现在呈现方式中。
4.5.2 多态的使用
多态的表现形式:
- 定义方法时形参为父类,调用方法时传入的参数为子类对象;
- 定义方法时返回值得数据类型为父类,调用方法时返回子类对象。
程序中可以使用(子类对象) new 父类对象()进行强制转换。
4.5.3 抽象方法和抽象类
抽象方法指使用abstract关键字声明某个方法的方法。
抽象方法的类必须是抽象类。
继承了抽象类的子类必须重写父类的抽象方法,如果子类也是抽象类可以不用重写父类的抽象方法。