day07(静态(static)+封装+继承+super关键字+方法的重写和重载)

2019.07.06(day07)

●static(静态)
所有的静态都是相关的,都是用static关键字修饰
-static关键字可以修饰成员变量,不能修饰局部变量
-static关键字可以修饰方法
-static,静态块/静态代码块 static{代码块}

static修饰的成员变量:
在方法区开辟内存
只有一份内存空间,任何方法都可以修改静态变量
一般静态变量做一些共用或公用的计数,要慎用
一般情况下static fianl 共同修饰成员变量

static修饰方法:
在方法区开辟内存
静态方法和非静态方法在方法区中存储是没有区别的,但是调用上有区别

静态方法:(可以用类名直接调用)
如果想要频繁的调用一个方法,这个方法不需要操作某个对象的数据时,这个方法最好设置成静态方法

非静态方法:
非静态方法被调用,必须实例化此方法所对应的类的对象,通过对象打点来调用这个非静态的方法
静态的都属于类,而不属于对象
静态方法中不能使用this,this属于对象,而不属于类

static修饰代码块 :satic{}(代码块就是包含一些代码逻辑)
静态代码块还是存储在方法区中
静态代码块执行的时机是有区别的

方法中的代码块:
	是否被执行,取决于程序员是否调用
静态代码块:
	在类加载到方法区后,就自动执行静态代码块

执行的顺序:
先执行静态代码块,然后执行类代码块,然后执行构造函数块

	a.第一个类加载,执行第一个类的静态代码块
	b.第一个类中包含第二个类作为第一个类的属性(注意,new和不new不一样)
		new:
			执行第二个类的类代码块
			执行第二类的构造方法
		不new:
			不加载第二个类,
	c.执行第一个类代码块,注意c步骤和b步骤的顺序
		b在c前,执行的顺序是:a->b->c->d
		c在b前,执行的顺序是:a->c->b->d
	d.执行第一个类的构造函数

静态+常量 :
static final 同时修饰(公有的静态的final常量)
公有的静态的final修饰的量的名字都是大写的,且单词间用下划线分隔开,这是一种约定俗成
public static fianl int FILE_LENGTH=4;

static+final的量一般出现在这样的类中

public class SysConstant{
	public static fianl int FILE_LENGTH=4;
	...
	//整个项目中所有用到的固定的常量,且值是不需要改变的
	//都可以放在此类中
}

使用的时候:
SysConstant.HEIGHT_SIZE来取出值即可

总结:
静态的方法只能访问静态的变量和静态的方法
非静态的方法可以访问静态的变量和静态的方法也可以访问非静态的方法和非静态变量
静态的方法既可以用对象调用(不建议),也可以用类名来调用(建议)

●封装:
把私有的数据封装,用公有的getter、setter和 构造存储数据和取出数据
类中值封装数据(适合做数据存储)
类中只封装功能(适合做功能)
类封装的就是属性和方法
最终把现实世界的事和物转到计算机中

●继承:
继承继承是通过extends关键字来实现的,必须以封装为基础
extends后的父亲只能有一个,所以Java是单继承
java的根类是Object类

为什么要继承?
实现继承就是为了代码的重用,继承充分的展现了代码的可复用性
因为现实世界有很多的继承关系,所以把现实世界的事或物转换到计算机中,
就需要java的继承

继承的优缺点:
优点:
代码重用
使用长辈中的内容(属性和方法)
缺点:
增加了类和类的复杂关系
如果继承的层次越多,子类中可访问的内容就越多,但是子类并不都需要

继承中的几个容易混淆的概念:
子类能够继承长辈的非私有的东西(属性和方法)
子类不是拥有长辈的东西,只是子类对长辈的东西有访问性
类里的东西就是本类自己的

有了继承之后,同样要考虑数据的存储问题,对象的数据该如何存取
在子类中利用继承的可访问性,调用长辈的方法,用长辈自己的方法
来操作长辈类中的私有属性

在开发中少用继承,多用组合:

什么时候使用继承:
-继承的层次不要太多
-要使用多态的时候必须是以继承为前提的

什么时候使用组合:
-想要获取别的类中的方法和属性的时候可以用组合
-现有,现组合

组合的方式有两种
方式一:(xx类有一个 test对象)
在类中组合放置属性/组合属性

public class xx{
	//组合另一个类的对象
	private Test tset;
	public void method(){
	//在此方法中可以使用或操作test对象中的数据
	}
}

方式二:(yy类中的method方法有一个test对象)
在类的方法中组合数据

public class yy{
	public void method(Test test){
	//在此方法中使用或操作test对象中的数据
	}
}

可以用继承和组合来获取别的类中的数据

●super关键字:
super(参数列表)
参数列表可以是0个也可以是多个
调用父类构造,且super(参数列表)只能写在子类构造的第一条语句
super()调用的是父类无参构造,如果不写,系统会自动添加上
super. 用来调用父类的方法或属性. 前提,父类是否允许子类调用

●方法的重载:
在同一个类中,有相同的方法的名字,
但参数的个数和类型不同
跟方法的返回值无关

比如:都是求和的功能
//此类是重载的方法

public class clac{
	public int sum(int a,int b){
		return a+b;
	}
	public float sum(float a,int b){
		return a+b;
	}
}

使用:
calc c=new calc();
int result1=c.sum(1,2);
float result2=c.sum(1.2f,3);

//此类不是重载的方法

public class clac{
	public int sum1(int a,int b){
		return a+b;
}
public float sum2(float a,int b){
	return a+b;
	}
}

使用:
calc c=new calc();
int result1=c.sum1(1,2);
float result2=c.sum2(1.2f,3);

重载的应用场景:
功能相似,但功能有一些细微的差异

●继承中的重写:
跨类且继承,子类重写父类的方法
方法重写的若干要求
1.子类重写的方法的权限修饰符必须大于等于父类
2.子类中重写的方法的返回值类型必须小于等于父类
3.如果父类的方法的返回值是基本数据类型或void
那么子类在重写方法的时候,返回类型必须一致
4.如果父类的返回类型是最终类(final),那么子类在
重写方法的时候.返回类型必须一致

一般情况下,只要父类中要重写的方法的声明和子类方法的声明一样即可

●重载和重写的区别:
重载:
在类内,相同的方法名称,但参数的个数和类型不相同
重写:
跨类且继承,子类把长辈的方法体覆盖

●访问修饰符:
public:本类中,子类中,同包类中,其他类中
protected:本类中,子类中,同包类中
默认/friendly/default:本类中,同包类中
private:本类中

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值