面向对象是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

封装

(把对象属性保护起来,外界不能直接访问,只能通过公共方法)

private可以实现有参封装和无参封装




java将object转化为实体类_System


继承(所有类的父类Object)

Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加


java将object转化为实体类_object 转对象_02


不可继承:

构造方法:类中的构造方法,只负责创建本类对象,不可继承。

private修饰的属性和方法:访问修饰符的一种,仅本类可见。

父子类不在同一个package中时,default修饰的属性和方法:


java将object转化为实体类_object 转对象_03


子类对方法覆盖:

当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖(Override)

方法覆盖原则: 方法名称、参数列表、返回值类型必须与父类相同。 访问修饰符不能比父类更严格。 方法覆盖的执行: 子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。

当子类重写了父类,产生了方法的覆盖,需要super加以区分,才能区别
super对于方法和实例的区分:

方法:

我B类,是继承A类的,A类的a方法,再B里重新写了下成立b,虽然功能更多,但是我忽然发现有些不合适,还是用a,就su

实例

super去指父类的实例per.a


public static void main(String[] args){
	B b=new B(); 
	b. print();
}
}

class A{
	int value=10;
}

class B extends A{
	int value=20; 
public void print(){
	int value=30;
	System. out. println(value); 
	System. out. println(this. value);
	System. out. println(super. value);
	}
}


在对于方法也是:


class A {
public A(){
	System. out. println("A()");
}
	public A(int value) {
		System.out.println("A(int value)");
	}
}

class B extends A {
	public B(){
		super(); 
		System. out. println("B()");
	}

	public B(int value){
		super(value); 
		system. out. println("B(int value)");
	}
}


B继承A

B的无参构造方法,前面会自带一个super()//隐藏

B的有参构造方法,(int a,int b ,int c),(也会带一个隐藏super()无参),我去调用A类中

(int a,int b)就可以做到,省的重写前两个

this和super区别:

this表示当前对象引用,调用本类(包括继承)的属性、方法、本类构造方法

super表示父类对象引用,调用父类的属性、方法、构造方法

会由this()指向的构造方法完成super()的调用。


class A{
public A(){
	System.out.println("A-无参构造");
}
 	public A(int value){
 		System.out.println("A-有参构造");
 	}
}
		
class B extends A{
	public B(){
		super();
		System.out.println("B-无参构造");
	}
		public B(int value){
			this();
			//super(5);
			System.out.println("B-有参构造");
		}
}

public class E{
public static void main(String[] args){
	new B(10);
}
}


多态

·场景一:父类形参实现多态,参数的类型更为宽泛。


public void feed(animal a) {
    System.out.println("喂食");
    a.eat();
}


在这里dog和bird的父类animal中,重写了feed(之前只能指定传进来dog或bird),这样接口就更广泛,只要你是animal的子类,都可以进来

·场景二:父类返回值实现多态,返回不同子类对象。


public animal buy(int type) {
    animal a=null;
    if(type==1) {
    a=new dog();
    }
    else if(type==2) {
    a=new bird();
    }
    return a;
}


多态的核心概念:

向上转型

animal a=new dog();父类引用中保存真实子类对象,仅可调用Animal中所声明的属性和方法或者dog类中重写的方法。

向下转型(拆箱)


Animal a=new Dog();
Dog b=(Dog)a;


强行转回dog,这样就能调用dog特有的属性和方法

那么向下转型的前提是向上转型,用animal声明的,向下转回去的时候,需要用instanceof来检测,比如dog不能转成cat


if(b instanceof dog ) {
		dog c=(dog) b;
		c.eat();
	}