Javabase-Week27

面向对象

面向对象特征

1.封装

封装就是给类中的属性和方法设定一定的访问范围。
权限修饰符:(限定变量或者方法的使用范围)

本类中子类中同包类中其他类中
public可以可以可以可以
protected可以可以可以不可以
默认可以同包子类可以可以不可以
private可以可以不可以不可以

2.继承

①this:代表的是本类的一个对象。

作用:
a.用来区分属性和形参同名的情况。
b.用来调用本类中的构造函数。 注意:必须在构造函数中调用,而且必须是第一句。
c.用来调用本类的属性和方法。

②super:代表的是父类的一个对象。

作用:
a.用来指定调用父类的某个构造函数。注意:必须在构造函数中调用,而且必须是第一句。
b.用来指定调用父类的属性和方法。

	super语句表示在子类的构造方法中调用父类对应形式的构造方法来创建一个父类对象。
	如果没有手动指定super语句,那么在编译的时候会自动添加一个super();
	如果父类只提供了含参构造,那么在子类的构造方法中必须手动提供对应形式的super语句。
③方法的重写

在父子类中存在了方法签名一致的非静态方法——方法的重写(两等两小一大)
1.在子类重写父类的方法时,子类方法的权限修饰符的范围应大于等于父类对应的权限修饰符的范围。

class A {
		protected void m(){}
}
class B extends A {
		protected void m(){} // 可以选用protected 和public
}
	A a = new B(); // a对象使用A类声明的,那么意味着a对象能干什么看的是A类,A类告诉a对象有一个m方法使用,并且m方法是用public,意味着a对象可以在任何地方使用m方法
	a.m(); // a对象的实际类型是B类型,a对象如何执行m方法看的是B类,然后B类告诉a对象m方法是protected修饰,不能在其他类中用

2.如果父类方法的返回值是基本类型void,那么子类重写的方法的返回值类型要和父类保持一致。

class A {
	protected void m(){}
}
class B extends A {
	protected void m(){}
}

3.如果父类方法的返回值类型是引用类型,那么子类重写的方法的返回值类型要么和父类返回值类型一致要么是从父类方法返回值类型的子类。

class A {}
class B extends A { public void mb(){} }
class C {
	public B m(){ ... };
}
class D extends C {
	public A m(){ ... }
}
		C c = new D(); // c对象使用C类声明的,所以C类告诉c对象有一个m方法可以使用,而且m方法的返回值类型是B类型,就可以调用B类中的mb方法
		c.m().mb(); // c对象的实际类型是D类,所以D类告诉c对象m方法的返回值类型是A类,A类中有mb方法么?
class A {
	public int m(){}
}
class B extends  A {
	public byte m(){} // 不行
}

注意:基本类型的大小指的是范围的大小 — 所有的基本类型都是平等的,没有继承关系。

4.方法签名相同。

3.多态

  1. 编译时多态:方法的重载。
  2. 运行时多态:向上造型、方法的重写。
重载

重点:父类引用指向子类对象的问题(向上造型)

class A {
		protected void m(){}
}
class B extends A {
		protected void m(){
		sout("m=====")} // 可以选用protected 和public
}
	A a = new B();

利用向上造型创建的对象,能干什么看的是父类;具体的执行看到是子类。举例:类似披着羊皮的狼,属性和方法属于🐏,具体干什么看的是🐺,也就是说执行的是子类的方法。

修饰符

Final

final是一个修饰数据、方法、类的修饰符。
1.final修饰数据,值在定义好之后不可改变 — 对于基本类型而言指的是实际值不可变;对于引用类型而言,指的是地址不可变。
如果是常量属性,需要在对象创建完成之间给值。— 如果是一个静态常量,需要在类加载完成之前给值 — 常量可以下声明后给值。
2.final修饰方法,不能被重写/隐藏 — 可以重载,可以被继承。
3.final修饰类 — 不能被继承。

Static(静态)

从概念上理解,类中定义的属性和方法都是为对象规定的,也就是说这要我们创建一个对象,这个对象就拥有这个类中的方法和属性,这些属性独属于对象,而静态不一样,只要用static来修饰,那么这个属性和方法就不在属于任何对象了,就意味着属于类了。

静态变量

static修饰变量——静态变量。静态变量在类加载的时候加载到方法区,并且在方法区中被赋予默认值。由于静态变量先于对象出现,所以可以通过类名来调用静态变量,也可以通过对象调用。这个类的所有对象存储的是这个静态变量在方法区的地址,所以所有对象是共享这个静态变量。
注意:

  1. 类是加载到方法区中——类中的所有的信息都会加载方法区中。
  2. 类是第一次使用的时候加载到方法区,加载之后不在移除——意味着类只加载一次。
  3. 所有的静态只能定义在类中不能定义到代码块中。
静态方法

用static修饰的方法,也叫类方法。随着类的加载而加载到方法区,只是存储在方法区中,在被调用的时候到栈内中执行。静态方法先于对象而存在的,所以习惯上是通过类名来调用静态方法。

静态代码块

用static{}定义的代码块。在类加载的时候执行一次——类只加载一次,因此静态代码块也只能执行一次。
执行顺序:父类静态 -> 子类静态 -> 父类非静态 -> 子类非静态

抽象类(abstract)

方法有方法声明和方法体两部分,如果一个方法只有方法的声明而没有方法体,那么我们就说这个方法是一个抽象的方法,抽象类就是含有抽象方法的类。
在抽象类中既有非抽象的方法也有抽象的方法,但抽象方法所在的类必须是抽象类。
抽象类不能创建对象,但是可以有构造函数。

接口(interface)

接口是一种特殊的抽象类,因为接口中的所有方法都是抽象方法。
用interface来定义接口,接口中都是抽象方法。(JDK1.8之后可以存在实体方法)
在JDK1.8之后,接口允许有实现方法,但必须是静态的;方法不写成静态,但必须用default修饰。
接口不能创建对象,也没有构造方法——接口不是类。
implements关键字可以让接口和类产生联系,即实现。类在实现接口要重写接口中所有的抽象方法。
单继承多实现:一个子类只能继承一个父类,一个实现类可以实现多个接口。并且接口可以继承接口,并且接口之间是多继承。

interface A {
	public int m();
}
interface B {
	public boolean m();
}
class C implements A, B {
	public int m(){} // 不行
	public boolean m(){}
}
new C().m();
	//接口中可以定义属性,属性默认是使用public static final修饰
	interface A {
	void m();
}
class B implements A {
	void m(){} // 接口中的方法默认是使用public修饰
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值