封装和继承
方法语法:
访问修饰符 特殊修饰符 返回值类型 方法名(形式参数列表){
// 方法体
[return xxx;]
}
分类:
-
无参无返(**场景:**往往是很简单想复用一段代码 没有什么具体的参数接入和值的返回)
public void print(){ }
-
无参有返(**场景:**往往是不需要你关注具体的底层实现,只需要关注你想得到的结果 例如:键盘录入nextInt())
public String print(){ return "xxxxx"; }
-
有参无返(**场景:**往往是需要你传入一个内容,然后我们帮你在方法内进行相应的加工处理<这个加工处理不需要给你返回结果> 例如:System.out.println(); 上节课练习的给小于60分的学生加2分)
public void print(String str){ }
-
有参有返(**场景:**往往是你需要给它一些内容,它加工之后,还需要将加工后的一个结果返还 例如:上节四则运算练习)
public double plus(double num1,double num2){ return num1+num2;z }
方法传参:(例子:网盘传递资料)
**基本数据类型:**在作为方法的参数传递时,传递的只是一个简单值内容,传递过去后的值和之前的值没有关系,两者或多者之前独立。(我分享了一个网盘资料地址,你保存到自己网盘了)
**引用数据类型:**在作为方法的参数传递时,传递的是引用(伪内存地址),所以传递过去之后,两者或多者之间共享同一块内存数据。(我分享了我的百度网盘帐号给你,你删了我的网盘内容,我就打死你)
特殊的方法-构造方法:
**作用:**初始化对象。
注意事项:
- 每一个类,系统都会给其配备一个默认的无参构造
- 如果你定义了一个构造方法(无参或带参都无所谓),那么系统就不会再给你配备了。
- 构造方法没有返回值类型,方法名必须和类名一致!
public 类名(){
}
this关键字
理解为当前对象,谁调用这个方法,谁就是当前对象。
Student wangMingXuan = new Student();
它可以在类中去调用对象可以调用一切内容。
this(); // 调用构造方法 必须是在构造方法的有效代码的第一行出现。
this.成员变量; // 调用变量
this.成员方法; // 调用方法
如果没有this,可能出现下方错误情况!!!
public class Student{
public String name;
public int age;
// (X) 局部变量优先级比较高
public Student(String name,int age){
name = name;
}
}
修复方案:
public class Student{
public String name;
public int age;
// (\/) this对象调用的变量是成员变量
public Student(String name,int age){
this.name = name;
}
}
方法重载:
发生在同一个类中,方法名相同,参数列表不同
(类型不同,个数不同,顺序不同)的情况就是方法重载。它与方法的返回值类型和访问修饰符无关!
int fix();
void fix();
fix();
成员变量和局部变量的区别:
初始值不同
位置不同
作用域不同
生命周期不同
本章内容介绍
面向对象是一种编程方法,一种编程的思想。
面向对象的编程方法中,有几个核心特性,也是它的优势体现。
**面向对象的三大特性:**封装、继承,多态。(如果面试官问题四大特性,再加上一个抽象)
封装和继承
1. 掌握什么是封装
**一个好的系统:**高内聚、低(松)耦合(功能之间相互独立,没有影响,不会牵一发而动全身)。
世界上没有完美的系统,只有接近完美的系统。
封装的作用(为什么需要封装):
如果没有封装,那么一个类中属性,可能会出现不合理赋值。
便于使用者正确使用系统,防止错误修改属性
有助于系统之间的松耦合,提高系统独立性
提高软件的可重用性
降低了构建大型系统的风险
**封装的定义:**将类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过类提供的公开的便捷的接口来进行访问赋值等。
原则:尽可能多的隐藏信息
,提供公开的接口
来访问。
2. 掌握如何使用封装
/**
* 一个类的封装过程:
* 1.属性私有化
* 2.提供公共的getter/setter方法
* 3.在getter/setter方法中添加控制语句(根据需求)
* @author Charles7c
* 2019年1月14日 上午9:55:55
*/
public class Monkey {
// 1.属性私有化-隐藏类信息 除了自己这个类 其他的外部类都无法直接访问
private String name;
private int health;
private int love;
// 2.提供公共的getter/setter方法-用于外部访问操作(便捷的接口)
// name的setter方法
public void setName(String name) {
this.name = name;
}
// name的getter方法
public String getName() {
return this.name;
}
public int getHealth() {
return health;
}
// 3.根据你的【实际需求】 去在对应的getter/setter方法中添加控制语句
public void setHealth(int health) {
if(health < 0 || health > 100) {
System.out.println("健康值非法!已经设置为默认值60!");
this.health = 60;
}else {
this.health = health;
}
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
}
3. 包的作用和使用
为什么需要包:
- 因为在各个平台系统中,同一个目录下不允许出现同名文件。
- 当我们文件(java代码等)越来越多的时候,全都放在一起会显得杂乱,不易管理和查找。有一定规则的包可以解决此问题。
- 有助于实施访问权限控制
使用包:
-
包名的命名规则:
-
所有的字母都小写(大多数场景下)
-
采用
反域名
命名法(公司域名的倒序) 例如:cn.kgc.xxx -
各级包应该有一定的规范:(根据不同公司会有出入)
一般都是4级包,可能有更多级,根据具体需求来。
cn :一级包
kgc :二级包 公司的名称
项目的名称:三级包
模块名或者层级名:四级包
**例如:**com.neteasy.cloudmusic.ui…
-
-
声明包地址
// 声明包地址的 它必须在文件的有效代码的第一行 package cn.kgc.demo2;
-
导入包(Eclipse快速导包:Ctrl+Shift+O)
// 导包:如果你要使用的类[不再同一个包下] 你就需要将它的地址导入过来 // 导包的语句必须是在类声明的上方,包声明的下方 // 语法:import 类的全类名/全路径/全限定名;(它也支持通配符) // import java.util.*; import java.util.Scanner;
java.lang
包下的类,不需要你手动声明,JVM会自动进行加载。**例如:**System
-
特殊情况
// 如果在一个类中,出现了使用两个不同包的同名类 必然有一个需要以全类名形式使用 cn.kgc.demo1.Cat cat = new cn.kgc.demo1.Cat();
4. 访问修饰符的使用
**private:**最严格的访问级别,只能在本类中使用。
**什么都不写(默认):**同包之间可以随意访问。
protected:// 一会讲完继承说
**public:**在整个项目都能使用
作用域 修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 |
---|---|---|---|---|
private | √ | |||
默认修饰符 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
**访问修饰符:**可以用来修饰类、修饰属性、修饰方法。
**作用:**为了隐藏某些细节,或者公开某些内容,控制访问权限。
5. static关键字
**static可以修饰变量:**静态变量/类变量
**static也可以修饰方法:**静态方法/类方法
**static也可以修饰代码块:**静态代码块
public class Dog {
// 成员代码块/构造代码块/非静态代码块:会随着对象的创建而执行里面的代码片段(创建一次对象就执行一次) 它优先于构造方法执行
{
}
// 静态代码块:会随着类的加载而执行里面的代码片段(只会执行一次)
static {
}
}
static修饰的类信息等和普通的成员(实例/对象)信息等的区别:
-
生命周期不同
类信息随着类加载而创建
实例信息随着对象产生而创建
-
"作用域"不同
类信息被该类的所有的对象共享,只要有一个对象更改,所有的对象获取的结果都会变化。
实例信息仅仅被自身对象所使用,不同对象之间的实例信息相互独立存在。
-
调用上有所不同
实例信息必须通过先创建对象,然后才能使用
类信息,直接可以用
类名.
的形式调用(当然也可以用对象来调用)
注意事项:
- 如果在多个对象之间,有共享的数据,且这个数据不会发生变动,最好定义为静态常量,可以有效提升效率。
static final修饰...
- 在类信息中,如果使用实例信息,需要注意先创建对象才能使用。而反之则无所谓。(自己思考谁先出生和谁后出生)