版权声明:©2018 本文為博主來秋原創,轉載請註明出處,博主保留追責權利。 https://blog.csdn.net/qq_30257081/article/details/83998702
1 封装
使用private修饰符将不想被外界访问到的属性和方法隐藏。
- 修饰符:(√:可访问/×:不能访问)
作用域 | 当前类 | 同一package | 子孙类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly(default) | √ | √ | × | × |
private | √ | × | × | × |
-
封装的好处?
类的开发者:将数据得到了保护,从而更的安全。
类的使用者:将所有的精力放在核心业务逻辑上。 -
封装对属性和方法都有要求:
- 对方法的要求:
- 核心方法需用public修饰
- 给核心方法提供服务的方法需要用private修饰
- 对属性的要求:
- 所有的属性都需要用private修饰,每个属性需配套提供两个public修饰的方法:
- 用来给属性赋值的方法setter
- 用来得到属性值的方法getter
- 所有的属性都需要用private修饰,每个属性需配套提供两个public修饰的方法:
- 对方法的要求:
//setter
public void setXXX(数据类型 变量名){
this.属性 = 变量名;
}
//getter
public 数据类型 getYYY(){
return 属性;
}
-
为什么要设置getter/setter方法?
setter方法专门用来赋值,getter方法专门用于获取。加上就可以控制使用者是否能获取,是否可以赋值。而不是让调用者直接调用修改成员变量。如果这个属性只能获取,可以只设置setter;如果只能赋值,getter就可以不写。 -
当有变量为使用随机数赋值,尽量不要写在方法中,直接赋值给成员变量并只设置getter方法。避免纠缠,效率更高。
2 继承
用extends实现两个类(子类 extends 父类)之间is a(是一个/是一种)的关系。继承是最简单的代码共享方式之一。Java只允许单继承,不允许一次继承多个类。
public class Test1{
public static void main(String[] args){
Cat cc = new Cat();
cc.setName("HelloKitty");
cc.age = 30;
cc.eat();
}
}
class Animal{//动物
private String name;
public void setName(String name){
//this的引用是成员变量中的name,等号右边为参数列表中的name
this.name = name;
}
public String getName(){
return name;
}
//未封装的变量
int age;
public void eat(){
System.out.println("eat");
}
}
class Cat extends Animal{//猫是一个动物
//继承来的name,age,eat()不需要再写
}
如果父类中方法设置了private,子类无法继承到,父类需提供一个public方法子类才可以继承。
3 多态
一个事物总有不同的名字去称呼他,一个对象总有不同的类型去定义他。
- 作用一:创建对象(非重点)
//父类类型 引用名= new 子类对象();
Animal aa = new Cat();
Person pp = new Student();
注意:当我们使用多态创建完一个对象之后,这个对象只能调用父类有的属性或者方法,一旦调用子类特有的属性或者方法,都会编译报错。如果new的是子类,实现父类方法,调用了子父类共有的方法,会执行子类的方法。原因是:
程序在编译阶段,编译器只看等号的左边进行语法检查,此时引用无法调用子类的方法。
运行阶段时,一个对象属于什么类型决定他能调用哪些方法,进行赋值、开辟空间等操作。
-
作用二:放在参数里面用于解除代码之间的耦合度(模块之间的关联程度) ★
方法定义(父类类型) service(Person x)
方法调用(子类对象) service( c )
public class Test2{
public static void main(String[] args){
//去餐厅吃饭
Chinese c = new Chinese();
Restaurant restaurant = new Restaurant();
restaurant.service(c);
}
}
class Restaurant{//餐厅
public void service(Person x){//相当于Person x = new Chinese/American/English();
//.getClass.getName()的意思是获取调用类的类名
System.out.println(x.getClass().getName() + "正常就餐");
}
/*省去这些方法的调用,减小耦合度,只需要在增减继承自Person的类,service方法传入父类Person对象即可
public void service(American x){
System.out.println("正常就餐");
}
public void service(Chinese c){
System.out.println("正常就餐");
}
public void service(English c){
System.out.println("正常就餐");
}
*/
}
class Person{}
class Chinese extends Person{}
class American extends Person{}
class English extends Person{}