Java笔记-面向对象

Java面向对象

对象内存分配

同一个包下的类调用可以省略导包语句
对象内存分配:
1.栈:main函数先入栈,然后开辟一段内存空间用于保存对象的地址值,然后main中调用类方法,根据调用顺序依次类方法依次入栈,入栈后该类方法再开辟新的内存空间,调用完成后类方法出栈
2.堆:保存的是对象中成员变量的值,以及成员方法的地址,成员方法的地址指向方法区
3.成员方法:包括了类的成员变量和成员方法
构造对象和调用方法内存中的变化如下:
在这里插入图片描述
当一个对象作为参数,传递到方法中时,实际上传进去的是对象的地址值,内存中的变化如下:
在这里插入图片描述
当一个对象作为方法的返回值时,返回值其实就是对象的地址值,内存中会产生一个临时对象,内存变化如下
在这里插入图片描述
局部变量和成员变量的区别
1.定义位置不同:
局部变量:在方法内部
成员变量:在方法外部,直接写在类中
2.作用范围不同:
局部变量:只有在方法中才可以使用,除了方法就不能再用
成员变量:整个类都可以通用
3.默认值不一样:
局部变量:没有默认值,如果想要使用需要手动赋值
成员变量:如果没有赋值就会有默认值
4.内存的位置不一样:
局部变量:位于栈内存
成员变量:位于堆内存
5.生命周期不一样:
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

类初始化

当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量名,如果需要访问本类当中的成员变量,需要使用this.成员变量名。通过谁调用的方法,谁就是this

一个标准的java类由四个部分组成:
1.所有成员变量设置为private私有
2.为每一个成员变量编写一堆Getter/Setter方法
3.编写一个无参数的构造方法
4.编写一个全参数的构造方法
IDEA中Code->Generate或者Alt+insert快捷键可以直接生成Getter/Setter方法以及有参数/无参数构造函数

Java中的继承

使用extends关键字继承,java语言是单继承的,一个类的直接父类只能有唯一一个
成员方法局部变量:在方法中直接访问
本类的成员变量:使用this.xxx访问
父类的成员变量:使用super.xxx访问
方法的重写override:在继承关系中,方法名称一样,参数列表也一样,在重写前可以添加@override来检测是不是有效的重写覆盖
方法的重载overload:方法名称一样,参数列表不一样
1.子类构造方法中隐含了默认的额super()方法的调用,一定是先调用父类的构造,后执行子类的构造
2.可以在子类构造函数中通过super( )调用父类重载的构造方法
3.2中所描述的子类构造函数中用super()调用父类构造函数必须在第一行,不能使用super()多次构造父类

Java抽象

抽象方法(相当于c++的虚函数):加上abstract关键字,去掉大括号{}直接分号结束
抽象类(相当于c++的虚基类):抽象方法所在的类必须是抽象类,在class之前写上abstract
如何使用抽象类和抽象方法:
1.不能直接创建抽象类对象
2.必须用一个子类来继承抽象父类
3.子类必须覆盖重写抽象父类中的所有抽象方法
4.创建子类对象进行使用

接口

接口是一种引用类型,最重要的内容就是其中的抽象方法,使用interface关键字,接口中的每一个方法都是隐式抽象的被定义为public abstract

接口使用的步骤:
1.接口不能直接使用,必须有一个实现类来实现该接口,使用implements关键字

public class 实现类名称 implements 接口名称{
}

2.接口的实现必须覆盖重写接口中所有的抽象方法,去掉abstract关键字,加上方法体大括号{}
3.创建实现类的对象,进行使用
接口的默认方法用于接口的扩展,可以通过接口实现类对象,直接调用默认方法,而不需要在实现类对象中再一次实现默认方法

Java多态

extends继承和implements接口实现是多态的前提
代码中体现多态性,其实即是:父类引用指向子类对象

父类名称 对象名 = new 子类名称();
或者
接口名称 对象名 = new 实现类名称()

多态中成员变量访问规则:
1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找
2.简介通过成员函数访问成员变量:看方法属于谁,优先用谁,没有则向上找

多态中成员方法的访问规则:
看new的是谁,则优先用谁,没有则向上找;不能通过多态中的父类对象来调用子类的方法,除非是子类中经过overide的方法

对象的向上转型:
其实就是多态写法,使用父类指针创建一个子类对象,当做父类来使用,向上转型一定是安全的,但是向上转型为父类无法调用子类特有的方法
对象的向下转型:
格式:子类对象 对象名 = (子类对象)父类对象 ,类似于类型强制转换
含义:将父类对象,还原成本来的子类对象

匿名内部类

如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该实现类的定义,而改为匿名内部类直接覆盖重写接口中所有的抽象方法
格式:
接口名称 对象名 = new 接口方法(){
//覆盖重写所有的抽象方法
}

public class Demomain{
	public static void man(string[] args){
	//一般写法
	Myinterface obj = new MyInterfaceImpl();//调用接口的实现类
	obj.method();
	//使用匿名内部类
	MyInterface obj =new Myinterface(){
	@Override
	public void method(){
		System.out.println("使用匿名内部类实现了方法!")
	}
	//new Myinterface(){}直接返回一个实现好的MyInterface接口
	}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值