Java小菜鸟的面试之路——面向对象的三大特征

1.继承 extends

子类继承父类,子类默认拥有父类的属性和方法(ps:父类的private属性不可继承,但可以通过父类封装的public方法获得)
举例:
Test1 有id,name等私有属性,id已封装(public),name不进行封装,还有protected addr 属性(不进行封装)

public class Test1 {
	
	private int id=4;
	private String name="zhangsan";
	protected String addr="南昌市";
	public int getId() {
		return id;
	}

Test2继承Test1类

public class Test2 extends Test1{
	
	private int age;
		
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String Methoad1(int num) {
		return "test";		
	}

	@Override
	public String toString() {
		return "Test2 [age=" + age + "]";
	}
	
}

在这里插入图片描述
在Test1的子类Test2中,可以通过父类Test1的public封装方法获取id的值,但无法获取name的值,因为它是父类的私有属性,且未进行封装

Test2 test2=new Test2();		
System.out.println(test2.addr);

但是可以直接调用父类的protected属性(public属性当然也可以)

2.封装

public class Test1 {
	
	private int id;
	private String name;
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

将类的属性通过get ,set方法进行封装,保证了数据的安全性

Ps -> elipse默认快捷键:

get set 方法: alt+shift+s  +R 
toString 方法:alt+shift+s  +S 
全参构造函数:alt+shift+s  +O 
无参构造函数:alt+/ 

3.多态

多态是  同一个行为  具有  多个不同表现形式或形态  的能力;
多态就是  同一个接口 ,使用不同的实例而执行不同操作;

优点:

1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性

必要条件:

1.继承
2.重写
3.父类引用指向子类对象

Ps:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

package dismiss;

public class Polymorphic {

public static void main(String[] args) {
	// TODO Auto-generated method stub
		
	show(new Cat());  //cat对象调用show方法  
	show(new Dog());  //dog对象调用show方法
	
	Animal animal=new Cat();  //使用Animal的引用实例化了一个Cat对象animal
	animal.eat();  //调用cat的eat方法
	Cat cat=(Cat) animal;  //Animal 没有work方法,只有强制转换陈Cat对象才能调用work函数
	cat.work();
	
}
public static void show(Animal a) {
	a.eat();
	if(a instanceof Cat) {
		Cat c=(Cat) a;
		c.work();			
	}else if(a instanceof Dog) {
		Dog d=(Dog) a;
		d.work();
	}
}

}

抽象父类Animal 有抽象方法eat()

abstract class Animal{
	public abstract void eat();	
	
	public void test() {
		System.out.println("123");
	}	
	//overload test 方法的重载——》参数类型、个数、顺序至少有一个不相同。 
	public void test(int num) {
		System.out.println("123");
	}
}

Cat类继承抽象父类Animal

class Cat extends Animal{  //继承抽象类需要重写,覆盖抽象父类的所有**抽象**方法

	@Override
	public void eat() {    //(重写,覆盖抽象父类的eat方法)
		// TODO Auto-generated method stub
		System.out.println("I like fish !");
	}
	public void work() {    // 	添加自己的方法work
		
		System.out.println("I can catch mouse !");
	}	
}

Dog 类继承抽象父类Animal

class Dog extends Animal{

	@Override
	public void eat() {  //(重写,覆盖抽象父类的eat方法)
		// TODO Auto-generated method stub
		System.out.println("I like bone");
	}
	public void work() {    // 	添加自己的方法work
		
		System.out.println("I can watch home !");
	}
}

rs:

I like fish !
I can catch mouse !
I like bone
I can watch home !
I like fish !
I can catch mouse !

尤其注意:重写override和重载overload 的区别
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。
重写(Overriding)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

部分参考:http://www.runoob.com/java/java-polymorphism.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值