目录
一、面向对象的首要特征:封装
在代码级别上,封装有什么作用?
怎么进行封装?
1、get方法的要求
2、set方法的要求
二、Static
static:
变量的分类:
变量根据声明的位置进行划分:
静态代码块
什么是静态代码块,语法是什么?
static静态代码块在什么时候执行?
三、实例语句块
实例语句块
实例语句语法
实例语句块在什么时候执行?
四、this
this什么?
this什么时候不能省略?
五、继承
继承作用?
java核心(方法的覆盖与多态)
六、覆盖
什么时候我们会考虑使用“方法覆盖”呢?
当代码怎么编写的时候,在代码级别上构成了方法覆盖呢?
七、多态
1、上线转型:
2、向下转型
多态指的是?
八、多态开发中的作用
软件开发原则有七大原则(不属于java,这个原则属于整个软件业)
什么开闭原则?
对于相同值类型可以修改一下吗?
一、面向对象的首要特征:封装
封装的作用:保证内部结构的安全,屏蔽复杂,暴漏简单。
在代码级别上,封装有什么作用?
一个类体当中的数据,假设分装之后,对于代码的调用人员来说,不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,来保证数据的安全性。
怎么进行封装?
第一步:属性私有化(使用private关键字进行修饰。)
private被这个关键字修饰后,该数据只能在本类中访问
private可以修饰 类、方法、还可以修饰属性
第二步:对外提供简单的操作入口
写一个方法专门完成读(get方法)
写一个方法专门完成写(set方法)
注意:java开发规范中有要求,set方法和get方法要满足以下格式
1、get方法的要求
public 返回值类型 get+属性名首字母大写(无参数){
return xxx;
}
2、set方法的要求
public void set+属性名首字母大写(有一个参数){
xxx=参数;
}
public class Person{ private int age; //get方法 public int getAge(){ return age; } //set方法 public void setAge(int age){//参数中的age不是上面的age,this.age才是上面的age this.age = age;//等号右边的age是参数中的age }}
二、Static
static:
- static翻译为“静态”
- 所有static关键字修饰的都是类相关,类级别的。
- 所有的static修饰的,都是采用“类名”的方法来访问。
- static修饰的变量:静态变量。
- static修饰的方法:静态方法。
变量的分类:
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。
class varTest{ //以下实例,都是对象相关,访问时采用“引用”的方法访问,需要先new对象。 //成员变量中的实例变量。 int i; public viid m2(){ } //以下静态的,都是类相关的,访问时采用“类名”的方式访问,不需要new对象。 static int k; public static void m1(){ }}
1、加static的变量叫做静态变量。
2、静态变量在类加载时初始化,不需要new对象。
3、静态变量存储在方法区。
静态代码块
什么是静态代码块,语法是什么?
使用static关键字可以定义:静态代码块。
static {
java语句;
java语句;
}
static静态代码块在什么时候执行?
类加载时执行,并且只执行一次。
注意:静态代码块在类加载时执行,并且在main方法执行前执行。
静态代码块一般是按照自上而下的顺序执行。
public class Test06{ //静态代码块(特殊的时机,类加载时机。) static{ System.out.println("A"); } //一个类中可以编写多个静态代码块 static{ System.out.println("B"); } public static void main(String[] agrs){ } static{ System.out.println("C"); } }
三、实例语句块
实例语句块
除了静态代码块之外,还有一种语句叫做:实例语句块。
实例语句在类加载时,没有执行。
实例语句语法
{
java语句;
}
实例语句块在什么时候执行?
只要是构造方法执行,必然在构造方法执之前,自动执行“实例语句块”中的代码。
public class Test{ public static void main(String[] agrs){ System.out.println("main begin"); } //实例语句块 { System.out.println("实例语句块执行"); } public InstanceCode(){ System.out.println("无参数构造方法"); } }
四、this
this什么?
- this是一个关键字,全部小写。
- 一个对象一个this。
- this是一个变量,是一个引用,this保存当前对象的内存地址,指向自身。所以,严格意义上来说,this代表的就是“当前对象”。
- this存储在堆内存当中对象的内部。
- this只能使用在实例方法中。谁调用这个实例方法,this就是谁(还可以在构造方法中)所以this代表的是“当前对象”。
- “this”大部分情况下是可以省略的。
- this不能使用在静态代码中,静态方法中不存在当前对象。
this什么时候不能省略?
class student{ private int no; public student(){ } public student(int no){ this.no = no; } public void setNo(int no){ this.no = no; }}
1、this除了可以使用在实例方法中,还可以用在构造方法中。
2、新语法:通过当前的构造方法去调用另一个本类的构造方法,可以使用以下语法格式:
this(实际参数列表);
3、this()这个语法作用是什么?
public class Date{ private int year; private int month; private int day; public Date(){//构造方法无参 this(2020,1,1); } public Date(int year,int month,int day){ this.year = year; this.month = month; this.day = day; }}
对this()的调用只能是构造方法的第一行。
五、继承
继承作用?
基本作用:子类继承父类,代码可以得到复用
主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。
class 类名 extends 父类名{
类体;
}
继承也是存在缺点的:耦合度高,父类修改,子类受牵连。
任何一个类,没有显示继承任何类,默认继承Object。
注意:当源码当中一个方法以“;”结尾,并且修饰符列表中有“native” 关键字,表示底层调用C++写的dll程序(dll动态链接库文件)
class A{}class B extends A{}
java核心(方法的覆盖与多态)
六、覆盖
什么时候我们会考虑使用“方法覆盖”呢?
- 子类继承父类之后,当继承过来的方法满足当前子类的业务需求时,子类有权力对这个方法进行重载编写,有必要进行“方法的覆盖”。
- 方法的覆盖又叫做:方法重写,英语单词叫做: override overwrite 都可以
- 比较常见的:方法覆盖,方法重写,override
class Animal{ public void move(){ System.out.println("动物在移动"); }}class Bird extends Animal{ //对move方法进行覆盖,方法重写,override //最好将父类中的方法原封不动的复制过来(不建议手动) //方法覆盖,就是将继承过来的那个方法给覆盖掉了,继承过来的方法没了 public void move(){ System.out.println("鸟儿在飞翔") }}class Cat extends Animal{ //方法重写 public void move(){ System.out.println("猫在走猫步"); }}
重要结论:当子类对父类继承过来的方法进行“方法覆盖”之后,子类对象调用该方法的时候,一定执行覆盖之后的方法。
当代码怎么编写的时候,在代码级别上构成了方法覆盖呢?
条件一:两个类必须要有继承关系。
条件二:重写之后的方法和之前的方法具有:
- 相同的返回值类型
- 相同的方法名
- 相同的形式参数列表
条件三:访问权限不能更低,可以更高。
条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少。
还有几点注意事项:(当学习多态方法后就明白了)
- 方法覆盖只是针对于方法,和属性无关。
- 私有方法无法覆盖。
- 构造方法不能被继承,所以构造方法也不能被覆盖。
- 方法覆盖只是针对于实例方法,静态方法没有覆盖的意义。
私有方法不能被覆盖
七、多态
1、上线转型:
子类-------转型-------->父类(自动类型转换)(upsasting)
2、向下转型
父类-------转型---------->子类(强制类型转换)(downcasting)
注意:java中允许向上转型,也允许向下转型。
无论是向上转型,还是向下转型,两种类型之间必须有继承关系,没有继承关系编译器报错。
多态指的是?
父类型引用指向子类型对象。包括编译阶段和运行阶段。
编译阶段:绑定父类的方法。
运行阶段:动态绑定子类型对象的方法。
public class Test{ public static void main(String[] args){ //多态 Animal a = new Cat();//向上转型 Cat x = (cat)a //向下转型 }}class Animal{}class Cat extends Animal{}
八、多态开发中的作用
软件开发原则有七大原则(不属于java,这个原则属于整个软件业)
其中有一条最基本的原则:ocp(开闭原则)
什么开闭原则?
- 对扩展开放(你可以额外添加,没问题)对修改关闭(最好很少的修改现在有程序)。
- 在软件扩展过程中,修改越少越好。
对于相同值类型可以修改一下吗?
- 对于返回值类型是基本数据类型,必须一致。
- 对于返回值类型是引用数据类型,重写之后返回值,类型可以变小。(但是意义不大)