javaOOP基础总结
类和对象
1.类和对象的关系
1.类
简单来说:类是抽象的,是对对象的抽象。
具体来说:类是对现实生活中一类具有共同特征的事物的抽象,实质是一种复杂的数据类型,不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
2.对象
简单来说:对象也是抽象的,是对客观事物的抽象。又是具体的,是类实例化的结果。
具体来说:对象是人们要进行研究的任何具体事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
3.类是对象的概括,对象是类的具体体现
根据一类对象进行概括,将对象的特征概括为属性,将对象的行为概括为方法,将这一类对象用一个类表示 — 类是对象的概括/抽取,通过new关键字来创建这个对象,然后可以给对象中的属性赋值,也可以调用方法
2.成员变量和局部变量
局部变量和成员变量
1.定义的位置不一样:
1) 局部变量:在方法的内部
2) 成员变量: 在方法的外部,直接写在类当中
2.作用范围不一样:
1) 局部变量:只有方法当中才可以使用,出了方法就不能再用了
2) 成员变量:整个类全都可以使用
3.默认值不一样:
1) 局部变量:没有默认值,如果想要使用,必须手动进行赋值
2) 成员变量:如果没有赋值,会有默认值,规则和数组一样。
4.内存位置不一样:
1) 局部变量:位于栈内存
2) 成员变量:位于堆内存
5.生命周期不一样:
1) 局部变量随着方法进栈而诞生,随着方法的出栈而消失
2) 随着对象的创建而诞生,随着对象被垃圾回收而消失
3.构造方法
java可以向C#一样,通过无参或带参数的构造方法(Constructor)完成赋值的初始化
在Penguin类中增加一个无参的构造方法Penguin(),如下
/**
* 宠物企鹅类,测试无参构造方法
*/
public class Penguin{
String name = "无名氏"; //昵称
int health = 100; //健康值
int love = 0; //亲密度
String sex = "Q仔"; //性别
/**
* 无参构造方法
*/
public Penguin(){
name = "楠楠";
love = 20;
sex = "Q妹";
System.out.println("执行构造方法");
}
/**
* 输出企鹅的信息
*/
public void print(){
System.out.println("宠物的自白:\n我的名字叫" + this.name
+ ",健康值是" + this.health + ",和主人的亲密度是"
+ this.love + ",性别是" + this.sex + "。");
}
/**
* 测试无参构造方法的使用
*/
public static void main(String[] args){
Penguin pgn = null;
pgn = new Penguin();
pgn.print();
}
}
Penguin()方法就是Penguin类的构造方法,构造方法是一个特殊的方法,当没有Penguin()方法时,系统会提供一个空的Penguin()方法。
构造方法的名称和类名相同,没有返回值类型,构造方法的主要作用就是在创建对象时执行一些初始化操作,比如给成员属性赋初始值。
1.方法重载(overload)
如何定义重载。方法的重写和重载只有一个字不同,很多初学者认为这两者十分相似,其实不然。方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。
2.方法重写
如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。重写体现了Java优越
性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。
所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。
1.重写规则
- 必须在同一个类里
- 方法名相同
- 参数列表(方法参数的个数或参数类型)不同
- 与方法返回值和方法修饰符没有任何关系
在使用this调用自身的其他构造方法时,只能作为第一条语句
2.在重写方法时,需要遵循以下的规则:
1.父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
2.父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
3.Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。
3.方法重写与方法重载的区别
区别点 | 重载 | 重写 |
---|---|---|
英文 | Overloading | Overiding |
定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数类型、返回值类型全部相同 |
方法名称相同,参数的类型或个数不同 | 被重写的方法不能拥有更严格的权限 | |
范围 | 发生在一个类中 | 发生在继承类中 |
4.结束语
在面向对象程序设计的思想中,类的继承和多态性主要就是体现在子类重写父类的方法。而构造方法的重载作为方法重载的一个典型特例,可以通过重载构造方法来表达对象的多种初始化行为。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载
可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。
4.this关键字
public Person(String name, int age, String sex) {
//有参构造
this.name = name; //区别参数和成员变量
this.age = age;
this.sex = sex;
}
this :表示对本类对象的引用
this(); 调用无参构造方法,必须写在构造方法中的第一行
5.static关键字
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的步骤
1,私有化属性
private String name;
private int age;
2,提供的公共方法来实现对隐藏信息的操作和访问(getter/setter)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
3,在方法中加入控制语句
public void setAge(int age) {
if(age<=0)
this.age=2;
this.age = age;
}
封装
1、方法、继承都是封装的一种体现,private(私有的)也是封装的一个体现。被private修饰的成员变量只能在本类中使用,外部不能直接通过对象属性改变。获取和改变需要提供设置器(访问接口|访问方法)和访问器来进行操作。
特点:
1、可以隐藏内部细节,对外提供公共访问方式。
2、提高安全性,提高代码的复用性。
2、这种多个封装的模板类统称之为javabean,模板类需要满足的一些规则
1)类是公共的
2)私有的属性
3)提供公有的访问方式 set、get
4)最好定义一个空构造
3、四种权限修饰关键字
1)private:只能被本类访问
2)default: 默认属性,并且不能写出来 只要你没有用其他修饰默认就是default
能被同包目录下访问
3)protected:除了能被同包访问,还可以给不同包下的字类访问
4)public:公共的 可以被其他包访问
4、注意:类名只能被 public和default修饰
继承
1,继承(extends)
extends:延伸 拓展
继承:子类继承父类,拥有父类的属性和方法。
public class Animal {
public String name;
public String sex;
}
class Dog extends Animal{
}
Dog dog = new Dog();
特点:
1,继承父类的属性和方法
2,不能继承父类的
private 修饰的属性和方法
父类的构造方法
子类和父类不在同一包下,使用默认的访问修饰符
3,java中的类只有单继承,一个子类只有一个父类。但是可以多重继承
4,一个类如果没有extends继承,默认继承Object。Object是所有类的父类
5,父类又叫超类,基类。子类又叫派生类。
2,方法的重写
当父类的方法满足不了子类的需求,这个时候需要子类重写父类的方法
特点:方法名和父类的方法名一致,返回值类型一致,参数列表一致,
子类方法的访问权限不能比父类的更严格。
子类的返回值可以是父类返回值对象的子类对象
public float eat(int a){
}
public int eat(int b){
}
3,super关键字
super:表示对父类对象的引用
super(); 调用父类的无参构造 必须写在构造方法中的第一行
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类的private成员
4,访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
private - 默认 - protected - public
5,重载(overload)和重写(override)的区别
位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 | |
---|---|---|---|---|---|
方法重写< |