Java面向对象之封装,继承与多态

1.封装

封装是将对象的属性和具体实现隐藏起来,通过提供方法来操作对象属性,提高了程序的安全性与扩展性

全类名包含包名 -- 包名.类名。

package,包,用于解决命名冲突问题,并且优化了项目结构,便于理解

package 包名;---要放在文件的第一行

import用于引进其他包的类 -- import 包名.类名 引入某个包里的某个类

                                               import 包名.*引入某个包里的所有类

import要放在package下面,放到class类上面。

2. 继承

Java继承只能单继承,并且继承具有传递性---父类的方法属性,子类可以使用调用

继承用关键字extends,class 子类名 extends 父类名{}

 1.1 this

在方法中this其实是一个成员变量,存储的是地址值,指的是当前对象,调用当前方法的对象。

在构造方法中,可以调用其他构造方法,并且其必须要放在第一行,不然报错

 1.2 super

super可以理解成父类对象,但super并不保存对象地址值,其是在堆内存中开辟了一个空间,并存储了父类的属性方法。

super()也必须要放在子类构造方法的第一行,不然报错,因此super()和this()不能同时出现。

当子类构造方法没有写super()方法时,编译器会自动添加一个super()方法。

当子类与父类属性方法同名时,可以通过super.属性名/方法名来调用父类的属性方法,如果不加super,则调用的是子类的属性方法。

 1.3 语句块

语句块相当于没有修饰符没有返回值没有名字的方法。

静态语句块---static{}与实例语句块---{}

静态语句块在类加载时执行,并且在程序生命周期内只执行一次,所以常用于初始化属性

实例语句块在创建对象过程中,执行构造方法之前执行

static String count;
	int name;

	public static void main(String[] args) {
		System.out.println(count);
		System.out.println(User.count);
		StaticPractise sp = new StaticPractise();
		sp.nsm();
	}

	public StaticPractise(){
		System.out.println("构造方法执行。。。");
	}
	
//实例代码块
	{
		System.out.println("实例代码块执行。。。");
	}

	public static void sm() {
		System.out.println("静态方法执行、、、");
	}

	public void nsm() {
		System.out.print("成员方法执行。。。");
	}

//静态代码块 用于属性初始化
	static {
		System.out.println("静态代码块执行,,,");
		sm();
	}

访问控制符:private只能在类中使用 default默认包内访问  protected同包或者有继承关系  public公共的,都可以访问

补充:静态属性与静态代码块在类加载进内存时进行初始化,并存储在方法区中,静态方法也存储在方法区,静态属性与静态代码块按顺序执行,从上到下。

3.多态

同一情况下,不同对象会有不同的状态就是多态

多态发生的前提是继承,重写与父类引用指向子类对象,

多态会降低代码的耦合度,维护性,扩展性和灵活性得到提高但是却会丢失子类的特有属性与方法。

public class Practise {
	public static void main(String[] args) {
		Father1 f1 = new Son1();
		// instanceof判断左边对象跟右边类是否是同种类或者有继承关系
		if (f1 instanceof Son1) {
			f1 = (Son1) f1;
		}
		System.out.println(f1.count);
		// 父类的
		System.out.println(f1.age);
		// 子类的,因为继承重写会覆盖父类的方法
		f1.m1();
		// 父类的
		f1.m2();
		// 多态会丢失子类的特有的方法,所以调用出错
//	f1.m3();
		// 返回值的多态
		System.out.println(returnPoly());
		argumentPoly(new Son1());
	}

//返回值的多态
	public static Father1 returnPoly() {
		return new Son1();
	}

//实参形参的多态
	public static void argumentPoly(Father1 f1) {
		f1.m1();
	}
}

class Father1 {
	int age = 1;
	static int count = 1;

	public void m1() {
		System.out.println("父类的m1方法");
	}

	public void m2() {
		System.out.println("父类的m2方法");
	}
}

class Son1 extends Father1 {
	int age = 2;
	static int count = 2;

	@Override
	public void m1() {
		System.out.println("子类的m1方法");
	}

	public void m3() {
		System.out.println("子类的m3方法");
	}
}

3.1 重写

重写需要方法名参数列表返回值类型相同,不能比原方法出现更宽泛的异常,也不能低于原方法的访问权限。

重写发生在父子类之间,子类重写父类方法

父类方法不能解决子类需求所以会发生重写

@Override源码注解,在编译之后就删除了,是为了提醒这是重写,并且不要写错

3.2 重载

方法名相同,参数列表不同(类型或个数不同)发生在一个类中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值