面向对象

浅谈面向对象三大特征

编程语言中的面向对象思想是非常重要的。不管是在实际开发当中还是在面试笔试时都会遇到。这里根据本人的理解,用通俗的语言解释一下。(不喜勿喷,谢谢)

说到面向对象,第一印象就是三个重要特征:封装、继承、多态

封装

首先,封装是将客观事物包装在了一个类中,类中包括事物本身的属性、行为等,我们可以根据自己的意愿,通过应用访问修饰符来改变调用他们(属性、行为等)的权限。
举个简单的例子,学校发给大家一张个人信息调查表填写。其中姓名、性别、民族、电话、兴趣爱好等等。这时,我们填写上的姓名、性别、联系方式是属性,而兴趣爱好便是行为(程序当中的方法)。以上的都属于公有(大家都可见)。而关于我们的隐私(私有),我们就不能随便填写了,当然可以通过一些方法让别人获取。

接下来我们注重说一下访问修饰符(以java语言为主)

访问修饰符分为四种根据权限大小依次为public、protected、default(friendly、缺省、一般不写)、private
public:公有的,在当前项目当中的所有非抽象类都可以获取。
protected:受保护的,在当前包的所有类中都可以获取,在其他包中只有子类(继承了当前被protected修饰类的类,也称派生类)可以获取。
default:只在当前包当中
private:只在当前类当中

如果不符合以上情况,但是需求某个类中的属性,一般可以通过getters和setters方法获得并赋值。

继承

说到继承我们想到了父类和子类(基类和派生类),可以说子类继承了父类除了私有以外的所有并为己所用。
子类会拥有父类的一般特性,但他们也会有独立的特性。以下举个例子。

public class Persion1 {
	private String name;
	private int age;
	
	public Persion1(String name,int age){
		this.name = name;
		this.age = age;
	}
	public void eat(){
		System.out.println("我会吃饭");
	}
	public void learn(){
		System.out.println("我会学习");
	}
}
public class Persion2 {
	private String name;
	private int age;
	
	public Persion2(String name,int age){
		this.name = name;
		this.age = age;
	}
	public void eat(){
		System.out.println("我会吃饭");
	}
	public void learn(){
		System.out.println("我会学习");
	}
}

通过代码我们可以看到Persion1和Persion2都有相同的特性,这时我们可以把相同的属性和方法写在同一个类中,通过继承来为己所用。可以降低代码的复杂度、提高代码的复用性,不必相同的代码写很多次。接下来就会变成:

public class Persion {
	private String name;
	private int age;
	
	public Persion(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
		System.out.println("我会吃饭");
	}
	
	public void learn(){
		System.out.println("我会学习");
	}
}

public class Persion1 extends Persion{
	public Persion1(String name,int age){
		super(name, age);
	}
	@Override
	public void eat() {
		// TODO Auto-generated method stub
		super.eat();
	}
	@Override
	public void learn() {
		// TODO Auto-generated method stub
		super.learn();
	}
}

public class Persion2 extends Persion{
	public Persion2(String name,int age){
		super(name, age);
	}
	@Override
	public void eat() {
		// TODO Auto-generated method stub
		super.eat();
	}
	@Override
	public void learn() {
		// TODO Auto-generated method stub
		super.learn();
	}
}

关于继承,有几个关键字需要记一下
extends:继承类,只可以单继承
implement: 实现接口(相当于继承接口的用法),可以多实现在后面加逗号即可
super:代表父类,只写在当前类构造函数的第一行
this:代表当前类,只写在当前构造函数中,但位置随意

多态

所谓多态,就是一种行为在不同的类中有着多个不同的表现形式。
多态出现在继承中,子类对象对父类的引用,重写父类的方法。
我们主要看例子说明:

public class Father {
	public Father(){
		System.out.println("this is Father()");
	}
	public Father(int i){
		System.out.println("this is Father(int i)");
	}
	public void A(){
		System.out.println("this is A()");
	}
	void B(){
		System.out.println("this is B()");
	}
}
class Son extends Father{

	@Override
	public void A() {
		// TODO Auto-generated method stub
		System.out.println("this is Son's A()");
	}
	
}
class test{
	public static void main(String[] args) {
		Son son = new Son();
		son.A();
		son.B();
	}
}
运行结果:
this is Father()
this is Son's A()
this is B()

最后我再插一嘴,
初始化对象(new Son())时,会先走父类的构造函数然后走当前类的构造函数。
如果想要结果出现this is Father(int i)只需将Son类改为:

class Son extends Father{
	public Son(){
		super(1);
	}

	@Override
	public void A() {
		// TODO Auto-generated method stub
		System.out.println("this is Son's A()");
	}

}
结果为:
this is Father(int i)
this is Son's A()
this is B()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值