【第7天】Java面向对象的三大特点及其应用

版权声明:©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
//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{}

猜你喜欢

转载自blog.csdn.net/qq_30257081/article/details/83998702