Java进阶

Java进阶

final关键字

重点:final修饰的值只能赋一次值,不能被改变;

在这里插入图片描述

1、final关键字

1.1、final修饰的类无法继承。
1.2、final修饰的方法无法覆盖。
1.3、final修饰的变量只能赋一次值。
1.4、final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但该引用指向的对象内部的薮据是可以修改的。
在这里插入图片描述
1.5、final修饰的实例变量必须手动初始化,不能采用系统默认值。
1.6、final修饰的实例变量一般和static联合使用,称为常量。
public static final double PI = 3.1415926;

抽象类

  1. 类到对象是实例化,对象到类是抽象
    抽象类:
    1. 什么是抽象类:
    2. 抽象类属于什么类型?
    3. 抽象类
    在这里插入图片描述
    在这里插入图片描述
  2. 抽象方法表示没有实现的方法,没有方法体的方法
    特点:没有方法体,以分号结尾;修饰符列表中有abstract
  3. 抽象类中不一定有抽象方法,但抽象方法必须在抽象类中
  4. abstract static void dosome();
    在这里插入图片描述

2、袖象类和接口以及抽象类和接口的区别。
2.1、抽象类

	第一:抽象类怎么定义?在class前添加abstract关键字就行了。
    
    第二:抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。
    第三: final和abstract不能联合使用,这两个关键字是对立的。
	第四:抽象类的子类可以是抽象类。也可以是非抽象类。
	第五:抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的.
	第六:抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
	第七:抽象方法怎么定义?
		public abstract void dosome ( ) ;
	第八(*****五颗星):一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行罪到目前为止,只是学习了抽象类的基础语法,一个类到底声明为抽象还是非抽象,

面试题 (判断题): java语言中凡是没有方法体的方法都是抽象方法。

不对,错误的-
object类中就有很多方法都没有方法体,都是以";"结尾的,但他们都不是抽象方法,例如:
public native int hashcode () ;
这个方法底层调用了C++写的动态链接库程序。
前面修饰符列表中没有: abstract。有一个native。表示调用JVM本地程序。

接口

2.2、接口的基础语法。
接口的存在是为了解耦合
1、接口是一种”引用数据类型”。
2、接口是完全抽象的。
3、接口怎么定义:[修饰符列表] interface接口名{}
4、接口支持多继承
5、接口中只有常量+抽象方法
6、接口中所有的元紊都是public修饰的
7、接口中抽象方法的public abstract可以省略。
8、接口中常量的public static final可以省略-
9、接口中方法不能有方法体

public class Test 01(){
	public static void main(){}
}

interface A{
  	void m1();
}

interface B extends A{
	void m1();
	void m2();
}
// 多继承
interface C extends B,C{
	void m1();
	void m2();
	
}
class D implements A,B,C{
	void m1();
	void m2();
	
}

interface MyMath{
	
	// 1. 接口中随便写一个变量都是常量,会默认在前面加public stati final
	double PI = 3.1415926
	int a = 1;
	// a = 3    // 2. 这里会报错,不能给常量PI赋值
	// 3. 抽象方法
	//public abstract int sum (int a, int b) ;
	// 4. 接口当中既然都是抽象方法,那么在编写代码的时候,public abstract可以省略吗?
	int surn (int a, int b);
	/* 5.接口中的方法可以有方法体吗?
	错误:接口抽象方法不能带有主体/*
	void dosome () {
	}
	*/
}

2.3、接口在并发中的作用。

接口的基础语法:
1、 类和类之间叫做继承,类和接口之间叫做实现
2、继承使用extends
3、实现使用implements
4、类与类之间只能单继承,接口弥补了单继承带来的缺陷

public class Test02{
	public static void main(String[]
 args){
 		 // new MyMath()	这是错误的语法,接口MyMath不能创建对象
 	MyMath mm = new  MyMathImpl();
 	// 调用方法
 	mm.sub(10,30);
 	mm.sum(10,30);
}

interface MyMath{
	
	// 1. 接口中随便写一个变量都是常量,会默认在前面加public stati final
	double PI = 3.1415926
	int a = 1;
	int sum(int a,int b);
	int sub(int a,int b);
}
// 编写一个类,这个类是非抽象的类
class MyMathImpl implements A,B,C{
	// 需要对父接口中的方法进行重写
	public int sum(int a,int b){
		return a+b;
	}
	int sub(int a,int b){
		return a - b;
	}
}
class Animal{
}

interface Flyable{
	// 接口中的方法没有方法体
	void fly();
}
// 
class Cat extends Animal implements Flyable{
	// 类中重写fly方法
    public static void fly(){
    	System.out.print("飞猫起飞");
    }
}

// 没有fly功能,不用实现接口
class Pig extends Animal {
    
}

复习多态:降低耦合度

public class Test{
	public static void main (String[]
 args){
 	// 创建主人对象
 	Master lm = new  Master();
 	// 创建宠物对象
 	Animal zangao = new Dog();
 	// 喂养宠物
 	zhangsan.feed(zangao);
 	
	}
}

// 主人类
public class Master{
	public void feed(Animal a){
		// 调用时识别传来的动物,若是Cat调用Cat的eat方法,Dog调用Dog类的eat方法
		a.eat();
	}
}
// Animal父类
public class Animal{
	// 父类方法
	public void eat(){
		System.Out.println("动物吃饭");
	}
} 

public class Dog extends Animal{
	// 覆盖父类eat方法
	public void eat(){
		System.Out.println("狗吃饭");
	}
} 

public class Cat extends Animal{
	public void eat(){
		System.Out.println("猫吃饭");
	}
} 

1.4、类型和类型之间的关系:
is a、ias a、 like a
is a:
cat is a Animal(猫是一个动物)凡是能够满足is a的表示继承关系”A extends B
has a:
I has a Pen(我有一支笔)
凡是能够满足has a关系的表示"关联关系"关联关系通常以"属性”的形式存在。

A{
	B b;
}

like a :
Cooker like a FoocMenu(厨师像一个菜单一样)凡是能够满足1ike a关系的表示“实现关系"
实现关系通常是:类实现接口。
implements B

1.5、抽象类和接口有什么区别?
抽象类和接口在语法上的区别:

抽象类是半抽象的-
接口是完全抽象的。

抽象类中有构造方法。接口中没有构造方法。
接口和接口之间支持多继承。类和类之间只能单继承。

一个类可以同时实现多个接口。
一个抽象类只能继承一个类(单继承)。

一般抽象类使用的还是少。接口一般都是对“行为“的抽象。

4个访问权限:
private:私有
protected :受保护
public:公开的
默认
在这里插入图片描述
1.3 访问权限修饰符可以修饰什么?
属性:4个都可以
方法:四种权限都可以
class:只有public和默认
接口:只有public和默认

equals

equals在Object类中是用“= =”判断两个对象的,在类中需要重写
equals用来判断两个对象是否相等,不能用“==”,因为“= =”判断的是两个对象的内存地址是否相等

int a =100;
int b =100;
boolean b1 = (a == b); // 返回true
Person t1 = new Person();
Person t2 = new Person();
boolean b2 = t1.equals(t2);	// 返回False
// 需在Person类中重写equals进行判断

java语言当中的字符串string有没有重写tostring方法,有没有重写equals方法。

  • 总结:
    1、string类已经重写了equals方法,比较两个字符串不能使用–,必须使用equals.equals是通用的。
    2、string类已经重写了tostring方法

  • 大结论:
    java中什么类型的数据可町以使用…–n判断
    java中基本数据类型比较是否相等,使用–java中什么类型的数据需要使用equals判断
    java中所有的引用数据类型统一使用equals方法来判断是否相等。这是规矩。

if (obj instanceof Student)
...

finalize()方法,垃圾回收机制

关于object类中的finalize()方法。

1、在object类中的源代码:
protected void finalize () throws Throwable { }

2、finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
3、这个方法不需要程序员手动调用,JVM的垃圾回收器负贲调用这个方法。
4、finalize()方法的执行时机:
	当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负贲调用finalize()方法。
5、finalize()方法实际上是sUn公司为java程序员准备的一个时机,垃圾销毁时机。如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
6、静态代码块的作用是什么?
static {
}
静态代码块在类加载时刻执行,并且只执行一次。这是一个suN准备的类加载时机。
finalize()方法同样也是SUN为程序员准备的一个时机。

垃圾回收时机

怎么把Person对象变成垃圾?
P-null;

  • 项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!!

  • 记录对象被释放的时间点,这个负责记录的代码写到哪里?
    写到finalize()方法中。

    class Person{
    重写finalize()方法
    }
    Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用: p.finalize();

protected void finalize() throws Throwable {
system.out.println (this +T"即将被销毁!");
}

hashCode方法:

  • 在object中的hashCode方法是怎样的?
    public native int hashcode () ;
  • 这个方法不是抽象方法,带有native关键字,底层调用c++程序。
  • hashcode 方法返回的是哈希码:
    实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。所以hashcode()方法的执行结果可以等同看做一个java对象的内存地址。
public class Test07 {
	public static void main (string [] args){
		Object o =new Object();
		int hashCodevalue = o.hashCode () ;
		System.out.println () ;

匿名内部类:
1、什么是内部类?
内部类:在类的内部又定义了一个新的类。被称为内部类。2、内部类的分类:
静态内部类:类似于静态变量实例内部类:类似于实例变量局部内部类:类似于局部变量

数组

Array
1、Java语言中的数组是一种引用数据类型。不属于基本数据类型。数组的父类是object。2、数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合。)
数组∶字面意思是“一组数据
3、数组当中可以存储"基本数据类型的数据,也可以存储引用数据类型的数据。4、数组因为是引用类型,所以数组对象是堆内存当中。(数组是存储在堆当中的)
5、数组当中如果存储的是"fjava对象”的话,实际上存储的是对象的引用(内存地址)”,数组中不能疸接存储jqva对象。6、数组一旦创建,在java中规定,长度不可变。((数组长度不可变)
7、数组的分类:一维数组、二维数组、三维数组、多维数组…(一维数组较多,二维数组偶尔使用!)8、所有的数组对象都有Length属性(java自带的),用来获取数组中元素的个数。
9、java中的数组要求数组中元素的类型统一。比如int类型数组只能存储int类型,Person类型数组只能存储erson类型。例如:超市购物,购物袋中只能装萃果,不能同时装萃果和橘子。
10、数组在内存方面存储的时候,数组中的元素内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。内存地址连续这是数组存储元素的特点(特色)。数组实际上是一种简单的数据结构。
11、所有的数组都是拿*第一个小方框的内存地址’作为整个数组对象的内存地址。(数组中首元素的内存地址作为整个数组对象12、数组中每一个元素都是有下标的,下标从e开始,以1递增。最后一个元素的下标是:Length - 1
下标非常重要,因为我们对数组中元秦进行存取"的时候,都需要通过下标来进行。
12、数组这种数据结构的优点和缺点是什么?
优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构。
为什么检索效率高?
第一:每一个元素的内存地址在空间存储上是连续的。
第二:每一个元素类型相同,所以占用空间大小一样。
第三﹔知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。
数组中存储100个元素,或者存储106万个元素,在元素查询/检索方面,效率是相同的,因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个内存地址,直接定位的。)
缺点:
第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。
第二:数组不能存储大数据量,为什么?
因为很难在内存空间上找到一块特别大的连续的内存空间。
注意:对于数组中最后一个元素的增删,是没有效率影响的。|

14、怎么声明/定义一个一维数组?
语法格式:
int[ ] arrayl;double[ ] array2;boolean[ ] array3;string[ ] array4;object[ ] array5;

15、怎么初始化一个一维数组呢?
包括两种方式:静态初始化一维数组,动态初始化一维数组。
静态初始化语法格式:
int[] array = {100,2100,300,55};
动态初始化语法格式:
int[ ] array = new int[5]; //这里的s表示数组的元素个数。
//初始化一个5个长度的int类型数组,每个元素默认值
String[] names = new String[6];l//初始化6个长度的String类型数组,每个元素默认值null。

11、内存结构
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

String在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值