java基础-------面向对象三大特性:封装、继承、多态

面向对象三大特性: 封装、继承、多态;
一、封装
1、定义:
封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。
2、实现方法:
使用private关键字修饰 类内部的属性;
3、如何访问:
在类内部定义get、set方法,实行使用对象调用方法对内部属性进行操作;
可参考我的另一篇文章,类和对象(oop)
二、继承
1、定义:类与类的一种关系,Java中是单继承,一个子类只能有一个父类,,一个父类可以有多个子类。
2、子类有自己的属性和方法,
3、 子类可以重写父类的方法;
4、子类拥有父类非private的属性和方法

5、 extends关键字;

class father {   //  此处是基类(父类)
	private int age;
	private String name;
	private char sex;
}
calss son  extends {  //   继承了father类,son类成了father类的子类	
}

3、super关键字;
super();—>调用父类的构造函数
super.父类非私有的数据成员—>访问父类的数据成员
super.fun();—>调用父类的成员方法
使用super调用父类的构造方法时,应该将此代码放置句首;

public class TestSuper {
	public static void main(String args[]) {
		ChildClass C1 =new ChildClass(100,200);         //   创建子类的对象
		C1.f();																	
	} 
}

class FatherClass{
	public int value;
	public 	FatherClass(int val) {       
		this.value=val;
		}
	public void f() {
		 value=100;
		System.out.println("Fatherclass的value值是"+value);
	}
}

class ChildClass extends FatherClass{
	public int value;
	public ChildClass(  int valueF, int valueC) {
		super(valueF);  							 //   调用父类的构造方法
		this.value=valueC;
	}
	public void f() {    //  子类方法,
		super.f();       //   使用super在子类中调用父类的方法;
		System.out.println("ChildClass的value值是"+value);  	// value》》》200
		System.out.println(value);  // 200
		System.out.println(super.value);    //  调用父类的非私有属性value      》》》100
	}
}

三:多态
定义:指的是是同一个方法调用,由于对象的不同可能会有不同的行为;
1:多态势方法的多态,不是属性的多态,(多态与属性无关)
2:多态的存在有三个必要条件:继承、方法重写、父类引用指向子类;
3:父类引用指向子类后,该父类引用调用子类重写的方法,此时多态就出现;
多态内存分析
在将父类引用指向子类之后,反编译之后却发现调用的仍然是父类方法,其原因是因为
将父类引用指向子类对象后,在堆中产生的子类对象拥有父类的非私有属性,同时在编译时,在方法区产生一个方法表,顶部存有对象的地址,其余是父类和子类可以调用的方法;在编译时,将子类方法的地址赋值给父类方法,因此调用其实父类方法的地址是指向了子类的方法;
图解:、
在这里插入图片描述

public class test {
	public static void main(String args []) {
		animal a= new animal();
	    animal d=new tiger();// 这里是强制向上转型,编译器认为 d 为animal, 将父类引用指向子类  
	   d.shout();    //  多态
	   d.eat();       	//  tiger类中并没有eat()方法,此处是调用父类方法;
	}
	static void animalCry(animal a){     // 使用父类的对象引用来调用子类方法。实现多态
		a.eat();
	}
}

class animal{   //  =============================== 父类
	public void shout() { //================父类方法1
		System.out.println("动物叫一声");
		
	}		
	public void eat() {		//================父类方法2
		System.out.println("动物吃饭时候要叫一声");
		shout();
	}
}

class dog extends animal{				//================子类1
	public void shout() {   // 重写父类方法
		System.out.println("汪汪汪");
	}
}

class tiger extends animal{				//================子类2
	public void shout() {	// 重写父类方法
		System.out.println("老虎嘶吼");
	}
}	

4、重写(覆盖)与重载:
重载(overload):指多个方法享有相同的名字,但是参数不同或者是参数类型不同(仅仅通过返回值不同不能区分是否重载);
重写(override):指子类继承父类方法,但是改写方法内容;
放一张图片形象比喻
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41884976/article/details/83552351
今日推荐