Java SE类和对象知识汇总

Java SE类和对象知识汇总

一、类的组成部分

成员变量
构造方法
成员方法(包括局部变量和方法体)

1、 成员变量和局部变量的区别

(1)在类中的位置不同
	成员变量:类中方法外
	局部变量:方法定义中或者方法声明上
(2)生命周期不同
	成员变量:随着对象的创建而存在,随着对象的消失而消失
	局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(3)初始化值不同
	成员变量:有默认值
	局部变量:没有默认值,必须定义,赋值,然后才能使用

2、构造方法

(1)作用:用于对对象的数据进行初始化
(2)格式:
	A:方法名和类名相同
	B:没有返回值类型,连void都不能有
	C:没有返回值
		思考:构造方法中可不可以有return语句呢?
		可以,而是我们要写成这个样子:return;
		其实,在任何的void类型的方法的最后你都可以写上:return;
(3)构造方法的注意事项
	A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
	B:如果我们给出了构造方法,系统将不再提供默认构造方法
		如果这个时候,我们要使用无参构造方法,就必须自己给出。
		推荐:永远手动自己给出无参构造方法。
(4)给成员变量赋值的方式
	A:setXxx()
	B:带参构造方法

二、类的三大特性

1、封装

1、目的:把不想让外界知道的细节隐藏起来,只提供公共的访问方式
2、如何封装:private,被此修饰符修饰的成员变量和成员方法只能
	在本类中被访问。通过this对封装的变量进行获取。以后,在写
	一个类时,最好将类中的成员变量全部用private修饰,并提供
	setXXX()和getXXX()的方法对封装的成员变量进行赋值和取值。

2、继承

(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
   这多个类就具备了这些内容。这个关系叫继承。
(2)Java中如何表示继承呢?格式是什么呢?
	A:用关键字extends表示
	B:格式:
		class 子类名 extends 父类名 {}
(3)继承的好处:
	A:提高了代码的复用性
	B:提高了代码的维护性
	C:让类与类产生了一个关系,是多态的前提
(4)继承的弊端:
	A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
		原则:低耦合,高内聚。
		耦合:类与类的关系
		内聚:自己完成某件事情的能力
	B:打破了封装性
(5)Java中继承的特点
	A:Java中类只支持单继承
	B:Java中可以多层(重)继承(继承体系)
(6)继承的注意事项:
	A:子类不能继承父类的私有成员
	B:子类不能继承父类的构造方法,但是可以通过super去访问
	C:不要为了部分功能而去继承
(7)什么时候使用继承呢?
	A:继承体现的是:is a的关系。
	B:采用假设法
(8)Java继承中的成员关系
	A:成员变量
		a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
		b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
			子类的方法访问变量的查找顺序:
				在子类方法的局部范围找,有就使用。
				在子类的成员范围找,有就使用。
				在父类的成员范围找,有就使用。
				找不到,就报错。
	B:构造方法
		a:子类的构造方法默认会去访问父类的无参构造方法
			是为了子类访问父类数据的初始化
		b:父类中如果没有无参构造方法,怎么办?
			子类通过super去明确调用带参构造
			子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
			让父类提供无参构造
	C:成员方法
		a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
		b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
			通过子类对象访问一个方法的查找顺序:
				在子类中找,有就使用
				在父类中找,有就使用
				找不到,就报错
(9)两个面试题:
	A:Override和Overload的区别?Overload是否可以改变返回值类型?
	B:this和super的区别和各自的作用?
(10)数据初始化的面试题
	A:一个类的初始化过程
	B:子父类的构造执行过程
	C:分层初始化

3、多态

(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
	A:有继承或者实现关系。
	B:有方法重写。
	C:有父类或者父接口引用指向子类对象。
	
	多态的分类:
		a:具体类多态
			class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		b:抽象类多态
			abstract class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		c:接口多态
			interface Fu {}
			class Zi implements Fu {}
			
			Fu f = new Zi();
(3)多态中的成员访问特点
	A:成员变量
		编译看左边,运行看左边
	B:构造方法
		子类的构造都会默认访问父类构造
	C:成员方法
		编译看左边,运行看右边
	D:静态方法
		编译看左边,运行看左边
		
	为什么?
		因为成员方法有重写。
(4)多态的好处:
	A:提高代码的维护性(继承体现)
	B:提高代码的扩展性(多态体现)
(5)多态的弊端:
	父不能使用子的特有功能。
	
	现象:
		子可以当作父使用,父不能当作子使用。
(6)多态中的转型
	A:向上转型
		从子到父
	B:向下转型
		从父到子
(7)孔子装爹的案例帮助大家理解多态

三、权限修饰符汇总

(1)分类:
权限修饰符:private,默认,protected,public
状态修饰符:static,final
抽象修饰符:abstract

(2)常见的类及其组成的修饰
类:
默认,public,final,abstract
常用的:public

成员变量:
private,默认,protected,public,static,final
常用的:private

构造方法:
private,默认,protected,public
常用的:public

成员方法:
private,默认,protected,public,static,final,abstract
常用的:public

(3)另外比较常见的:
public static final int X = 10;
public static void show() {}
public final void show() {}
public abstract void show();

(4)直观显示
				本类	同一个包下	不同包下的子类	不同包下的无关类
	private		Y
	默认		Y		   Y
	protected	Y		   Y			Y
	public		Y		   Y			Y				Y
这四种权限修饰符在任意时刻只能出现一种。

1、private

(1)私有的意义,可以修饰成员变量和成员方法
(2)特点:
	被private修饰的后的成员只能在本类中被访问
(3)private的应用:
	以后再写一个类的时候:
		把所有的成员变量给private了
		提供对应的getXxx()/setXxx()方法

2、static

(1)静态的意思,可以修饰成员变量和成员方法。
(2)静态的特点:
	A:随着类的加载而加载
	B:优先与对象存在
	C:被类的所有对象共享
		这其实也是我们判断该不该使用静态的依据。
		举例:饮水机和水杯的问题思考
	D:可以通过类名调用
		既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
(3)静态的内存图
	静态的内容在方法区的静态区
(4)静态的注意事项;
	A:在静态方法中没有this对象
	B:静态只能访问静态(代码测试过)
(5)静态变量和成员变量的区别
	A:所属不同
		静态变量:属于类,类变量
		成员变量:属于对象,对象变量,实例变量
	B:内存位置不同
		静态变量:方法区的静态区
		成员变量:堆内存
	C:生命周期不同
		静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
		成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
	D:调用不同
		静态变量:可以通过对象名调用,也可以通过类名调用
		成员变量:只能通过对象名调用

3、final

(1)最终的意思,可以修饰类,方法,变量。
(2)特点:
	A:它修饰的类,不能被继承。
	B:它修饰的方法,不能被重写。
	C:它修饰的变量,是一个常量。
(3)面试相关:
	A:局部变量
		a:基本类型 值不能发生改变
		b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
	B:初始化时机
		a:只能初始化一次。
		b:常见的给值
			定义的时候。(推荐)
			构造方法中。

4、abstract

(1)把多个共性的东西提取到一个类中,这是继承的做法。
   但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。
   也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
   所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
   而一个没有具体的方法体的方法是抽象的方法。
   在一个类中如果有抽象方法,该类必须定义为抽象类。
(2)抽象类的特点
	A:抽象类和抽象方法必须用关键字abstract修饰
	B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
	C:抽象类不能实例化
	D:抽象类的子类
		a:是一个抽象类。
		b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
(3)抽象类的成员特点:
	A:成员变量
		有变量,有常量
	B:构造方法
		有构造方法
	C:成员方法
		有抽象,有非抽象
(4)抽象类的练习
	A:猫狗案例练习
	B:老师案例练习
	C:学生案例练习
	D:员工案例练习
(5)抽象类的几个小问题
	A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
		用于子类访问父类数据的初始化
	B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
		为了不让创建对象
	C:abstract不能和哪些关键字共存
		a:final	冲突
		b:private 冲突
		c:static 无意义

四、其他重要知识补充

1、匿名对象

(1)没有名字的对象
(2)应用场景
	A:调用方法,仅仅只调用一次的时候。
	b:可以作为实际参数传递。

2、代码块

(1)用{}括起来的代码。
(2)分类:
	A:局部代码块
		用于限定变量的生命周期,及早释放,提高内存利用率。
	B:构造代码块
		把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。
	C:静态代码块
		对类的数据进行初始化,仅仅只执行一次。
(3)静态代码块,构造代码块,构造方法的顺序问题?
	静态代码块 > 构造代码块 > 构造方法

3、接口

(1)回顾猫狗案例,它们仅仅提供一些基本功能。
   比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
   是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
(2)接口的特点:
	A:接口用关键字interface修饰
		interface 接口名 {}
	B:类实现接口用implements修饰
		class 类名 implements 接口名 {}
	C:接口不能实例化
	D:接口的实现类
		a:是一个抽象类。
		b:是一个具体类,这个类必须重写接口中的所有抽象方法。
(3)接口的成员特点:
	A:成员变量
		只能是常量
		默认修饰符:public static final
	B:构造方法
		没有构造方法
	C:成员方法
		只能是抽象的
		默认修饰符:public abstract
(4)类与类,类与接口,接口与接口
	A:类与类
		继承关系,只能单继承,可以多层继承
	B:类与接口
		实现关系,可以单实现,也可以多实现。
		还可以在继承一个类的同时,实现多个接口
	C:接口与接口
		继承关系,可以单继承,也可以多继承
(5)抽象类和接口的区别(自己补齐)?
	A:成员区别
		抽象类:
		接口:
	B:关系区别:
		类与类:
		类与接口:
		接口与接口:
	C:设计理念不同
		抽象类:is a,抽象类中定义的是共性功能。
		接口:like a,接口中定义的是扩展功能。
(6)练习:
	A:猫狗案例,加入跳高功能
	B:老师和学生案例,加入抽烟功能

4、形式参数和返回值

(1)形式参数:
	类名:需要该类的对象
	抽象类名:需要该类的子类对象
	接口名:需要该接口的实现类对象
(2)返回值类型:
	类名:返回的是该类的对象
	抽象类名:返回的是该类的子类对象
	接口名:返回的是该接口的实现类的对象
(3)链式编程
	对象.方法1().方法2().......方法n();
	
	这种用法:其实在方法1()调用完毕后,应该一个对象;
		      方法2()调用完毕后,应该返回一个对象。
			  方法n()调用完毕后,可能是对象,也可以不是对象。

5、包的相关知识

(1)包其实就是文件夹
(2)作用:
	A:区分同名的类
	B:对类进行分类管理
		a:按照功能分
		b:按照模块分
(3)包的定义(掌握)
	package 包名;
	多级包用.分开。
(4)注意事项:(掌握)
	A:package语句必须在文件中的第一条有效语句
	B:在一个java文件中,只能有一个package
	C:如果没有package,默认就是无包名			
(5)导包(掌握)
我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import。
格式:
	import 包名...类名;
另一种:
	import 包名...*;(不建议)
(3)package,import,class在代码中出现的顺序
	package > import > class

6、内部类

(1)把类定义在另一个类的内部,该类就被称为内部类。
	举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
	A:可以直接访问外部类的成员,包括私有
	B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
	A:成员内部类
	B:局部内部类
(4)成员内部类
	A:private 为了数据的安全性
	B:static 为了访问的方便性
	成员内部类不是静态的:
		外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
	成员内部类是静态的:
		外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)成员内部类的面试题(填空)
	要求程序输出为:30,20,10
	class Outer {
		public int num = 10;
		
		class Inner {
			public int num = 20;
			
			public viod show() {
				int num  = 30;
				
				System.out.println(num);
				System.out.println(this.num);
				System.out.println(Outer.this.num);
			}
		}
	}
(6)局部内部类
	A:局部内部类访问局部变量必须加final修饰。
	B:为什么呢?
		因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
		所以,堆内存还是用该变量,而改变量已经没有了。
		为了让该值还存在,就加final修饰。
		通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(7)匿名内部类(掌握)
	A:是局部内部类的简化形式
	B:前提
		存在一个类或者接口
	C:格式:
		new 类名或者接口名() {
			重写方法;
		}
	D:本质:
		其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类在开发中的使用
	我们在开发的时候,会看到抽象类,或者接口作为参数。
	而这个时候,我们知道实际需要的是一个子类对象。
	如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
	
	interface Person {
		public abstract void study();
	}
	
	class PersonDemo {
		public void method(Person p) {
			p.study();
		}
	}
	
	class PersonTest {
		public static void main(String[] args) {
			PersonDemo pd = new PersonDemo();
			pd.method(new Person() {
				public void study() {
					System.out.println("好好学习,天天向上");
				}
			});
		}
	}
	
(9)匿名内部类的面试题(补齐代码)
	interface Inter {
		void show();
	}
	
	class Outer {
		//补齐代码
		public static Inter method() {
			return new Inter() {
				public void show() {
					System.out.println("HelloWorld");
				}	
			};
		}
	}
	
	class OuterDemo {
		public static void main(String[] args) {
			Outer.method().show(); //"HelloWorld"
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值