Day1
继承
Java类中支持多层继承
可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
格式:public class 子类名 extends 父类名{}
子类可以有父类的内容
子类还可以有自己特有的内容
弊端:当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
什么使用:当有个A和B两类时 A是B的一种 B是A的一种 猫和动物
继承中变量的访问特点:
在子类方法中访问一个变量,子类局部-子类成员-父类成员
super关键字:
访问本类的成员变量age this.age
访问父类的成员变量age spuer.age
继承中构造方法的访问特点:
子类中所有的构造方法默认都会访问父类中无参构造方法?
因为子类会继承父类中的数据,可能还会使用父类的数据,所以子类初始化之前,一定先完成父类数据的初始化。
每一个子类构造方法的第一条语句默认都是:super()
如果父类没有无参构造方法?
1 通过使用super关键字去显示的调用父类的带参构造方法,
2 在父类中自己提供一个无参构造方法。
继承中成员方法的访问特点:
通过子类对象访问一个方法:子类成员范围找-父类成员范围找
方法重写: 为什么方法重写???
子类中出现了和父类中一模一样的方法声名
当子类需要父类的功能,而功能主体子类有 自己特有内容时,可以重写父类中的方法,即沿袭了父类的功能,又定义了子类特有的内容。
@Override:注解 可以帮助我们检查重写方法的方法声明的正确性
注意事项:
私有方法不能被重写(private)
子类方法访问权限不能更低(public>默认>私有)
下面是权限修饰符:
状态修饰符:
final(最终态):关键字是最终的意思,可以修饰成员方法,成员变量,类
fianl修饰的特点:
修饰方法:表明该方法时最终的方法,不能被重写
修饰变量:表明该变量是常量,不能再次被赋值
修饰类:表明该类是最终类,不能被继承
final修饰局部变量:
变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
变量是引用类型:final修饰值得是引用类型的地址值不能发生改变**,但是地址里面的内容是可以发生改变的**
static(静态):关键字是静态的意思,可以修饰成员方法,成员变量
static的特点:被类的所有的对象共享
可以通过类名调用,或者使用对象名调用
非静态方法可以访问静态方法,静态方法可以访问静态方法
因为main方法是静态的所以用静态的成员方法
静态成员方法只能访问静态成员
项目>模块>包>类
包的概述和使用
包其实就是文件夹,作用:对类进行分类管理 多级包用.分开 package
导包:格式 import 。。。。
day2
多态
同一个对象,在不同时刻表现出的不同形态
多态的前提:
1.有继承 或着实现关系
2.有方法重写
3.有父类引用指向子类对象
多态中成员访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样呢???
因为成员方法有重写,而成员变量没有
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能。
多态中的转型:
向上转型:从子到父 父类引用指向子类对象
向下转型:从父到子 父类引用转为子类对象
抽象类:
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
构造方法用于子类访问父类
public void eat() {
System.out.println(“默哀吃”);
}
大括弧中就是方法体
这个是抽象方法:public abstract void eat(); 该类必须也是抽象类 public abstract class animal{}
抽象类如何创建对象??
抽象类会参照多态的方式
抽象类的成员特点:
成员变量:
可以是变量也可以是常量。
构造方法:
有构造方法,但是不能实例化(但是可以同多态的方式)
构造方法的作用是什么呢?用于子类访问父类数据的初始化
成员方法:
可以有抽象方法:限定子类必须完成某些动作,也可以有非抽象方法,提高代码的复用性
public abstract void eat(); 这是个抽象方法
抽象类的作用一般是为了其子类规定一些必须的功能和方法, 但是这些方法不能够被抽象类实现. 抽象类中除了抽象方法(也就是其子类必须重写的方法), 还可以定义普通的方法, 尽管这些方法不能被抽象类的实例使用, 但它却可以被其子类 作为公用方法来使用 使用.
举个例子, 定义"多边形"抽象类(类中定义了多边形各点的数组), 除了定义那些抽象方法(及子类的实现各不相同的方法), 还可以定义子类都可以使用的通用方法, 如"多边形面积的计算","周长的计算"等等…这样, 其子类三角形就不用在写上述方法了
抽象类、就是一个用abstract修饰的类,在这个类中、你可以定义一些不需要具体实现的方法、也就是没有方法体的方法、这些方法叫做抽象方法、当一个类要继承这个抽象类时、就必须要实现这些抽象方法、。当你在做一个比较复杂的项目时、一些简单的方法就可以马上写出来、但一些复杂的方法、在不同的类中需要不同的实现、那么这个时候就需要用到抽象类的。
接口-interface
接口就是一种公共的规范标准,只要符合规范标准,大家都可以使用,
Java中的接口更多的体现在对行为的抽象
接口的特点:
接口不能实例化 实现类 对象 --多态的方式
接口的特点
1.接口用关键字interface修饰
public interface 接口名{}
2.类实现接口用implements表示
public class 类名 implements 接口名{}
接口不能实例化
接口如何实现实例化???参照多态的方式,通过实现类对象实例化,这叫接口多态
多态的形式:具体类多态, 抽象类多态,接口多态
多态的前提:有继承或者实现关系;有方法重写;有父类或接口引用指向子类或者实现类对象
接口的实现类
要么重写接口中的所有抽象方法
要么时抽象类
接口的成员特点
1.成员变量
只能时常量
默认修饰符:public static final
2.构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在一个类如果没有父类,默认继承自Object类
3.成员方法
只能是抽象方法
默认修饰符:public abstract
关于接口中的方法,后面JDK的有的新特性自己了解
类和接口的关系
类和类的关系??
继承关系,只能单继承,但是可以多层继承
类和接口的关系??
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系??
继承关系,可以单继承,也可以多继承
门和警报的例子
day3
形参和返回值的问题??
1.类名作为形参和返回值??
类名作为形参就要要的该类的对象,
方法的形参是类名,其实需要的是该类的对象
方法的返回值是类名,其实返回的是该类的对象
2 抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是该抽象类的子类对象
方法的返回值是抽象类名,其实返回的是该抽象的子类对象
3 接口名作为形参和返回值
方法的形参是接口,其实需要的是该接口的实现类对象
方法的返回值是接口,其实返回的是该接口的实现类对象
测试类:下
内部类
就是在一个类中定义一个类,在一个类A的内部定义一个类B,类B就被称为内部类
格式:
public class 类名(){
修饰符 class 类型{
}
}
内部类的访问特点:
内部类可以直接访问外部类的成员 包括私有
外部类要访问内部类的成员,必须创建对象
成员内部类
在类的成员位置:成员内部类
在类的局部位置:局部内部类
成员内部类,外界如何创建对象使用呢?
格式:外部类名.内部类名 对象名=外部类对象.内部类对象
局部内部类
局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量
public class Outer {
private int num=10;
public void method(){
int num2=20;
class Inner{
public void show(){
System.out.println(num2);
System.out.println(num);
}
}
Inner i=new Inner();
i.show();
}
}
匿名内部类
匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用。
前提:存在一个类或接口,这里的类可以是具体类也可以是抽象类
格式:
new 类名或者接口名(){
重写方法(继承前面的类或者是接口);
}
范例:
new Inter(){
public void show(){
}
}
本质:是一个继承了该类或者实现了该接口的子类匿名对象
Math类概述
Math包含执行基本数字运行算的方法
没有构造方法,如何使用类中的成员呢???
看类的成员是否都是静态的,如果是通过类名就可以直接调用。
System类
System包含几个有用的类字段和方法,它不能被实例化(也就是不能创建对象,可以通过类名调用)
public static void exit(int status) :终止当前运行的Java虚拟机,非零表示异常终止
public static long currentTimeMillis() :返回当前时间(以毫秒为单位)
Object类的概述
Object是类层次结构的根,每个类都可以将Object作为超类,所有类直接或者间接的继承自该类
构造方法:public Object
回想面向对象中为什么说子类的构造方法默认访问是父类的无参构造方法呢??
因为它们的顶级父类只有无参构造方法
public class ObjectDemo55 {
public static void main(String[] args) {
Student s = new Student();
s.setName("科比");
s.setAge(23);
System.out.println(s);//com.it.heima.Student@1b6d3586
System.out.println(s.toString());//com.it.heima.Student@1b6d3586
}
建议所有子类重写tostring方法
Object 类的常用方法
public String toString() :返回对象的字符串表示形式,建议所有子类重写该方法,自动生成。
public boolean equals (Object obj) :比较对象是否相等,默认比较地址,重写可以比较内容,自动生产。
冒泡排序
排序:将一组数据按照固定的规则进行排列。
冒泡排序:一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将比较的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序。
如果有n个数据进行排序,总共需要比较n-1次每一次比较完毕,下一次的比较就会少一个数据参与
Arrays类包含用于操作数组的各种方法
public static String toString(int[] a) :返回指定数组的内容字符串形式
public static void sort(int[] a) :按照数字顺序排列指定的数组
如果一个没有构造方法,系统就会默认给出无参构造(Object),如果系统给了,这个类是可以创建对象的
工具类的设计思路:
构造方法用private修饰,是为了防止外界创建对象。
成员用public static修饰,是为了让使用类名,来访问该成员方法
Day4
基本类型包装类概述
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据
常用的操作之一:用于基本数据类型于字符串之间的转换
public static void main(String[] args) {
//需求:要判断一个数据是否在int 范围内
//public static final int MAX_VALUE
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE);//2147483647
}
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
Integer类的概述的使用
Integert:包装一个对象中的原始类型int的值;
public static Integer valueOf(int i) 返回表示指定的int值的Integer实例
public static Integer valueOf(String s) :返回一个保存指定的Integer对象String
int和string的相互转换
自动装箱和拆箱
装箱:把基本数据类型转换威对应的包装类型
拆箱:把包装类类型转换为对应的基本数据类型
使用引用类型前,判断是否为null
注意:在使用包装类类型的时候,如果做操作,最好先判度是否为null,我们推荐的是,只要是对象,在使用前就必须进行不为null的判断/。
Date代表了一个特定的时间,精确到毫秒。(下面是构造方法)
public Date(): 分配一个Date对象,并初始化,以便它表示它被分配的时间,精确到毫秒
public Date(long date) 分配一个Date对象,并将其初始化为表示从标准基准时间指定的毫秒数
public static void main(String[] args) {
Date d1 = new Date();
System.out.println(d1);//Thu Jun 24 08:48:20 CST 2021
long date=1000*60*60;
Date d2 = new Date(date);
System.out.println(d2);//Thu Jan 01 09:00:00 CST 1970
}
Date类的常用方法
public long getTime() :获取的是日期对象从1970年1月1日00:00:00到现在的毫秒
public void setTime(long time) :设置时间,给的是毫秒值
SimpleDateFormat类概述
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期,重点学习日期格式和解析
日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从‘A’ 到‘Z’ 以及从‘a’到’z’引号的字母被解释为表示日期或时间字符串的组件模式字母。
常用的模式字母以及对应关系如下:
y:年 M :月 d:日 H :时 m:分 s:秒
SimpleDateFormat的构造方法
public SimpleDateFormat() 构造一个SimpleDateFormat ,使用默认模式和日期模式
public SimpleDateFormat(String pattern(模式)): 构造一个SimpleDateFormat使用给定的模式和默认的日期格式
SimpleDateFormat 格式和解析日期
1.格式化(从Date到String)
public final String format(Date date): 将日期格式化成日期/时间字符串
2.解析(从String 到Date)
public Date parse(String source):从给定字符串的开始解析文本以生成日期
工具类
Calendar类的概述 简称日历类
Calendar为某一时刻和一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法
Canlendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化
Calendar rightNow=Calendar.getInstance();
Calendar方法:
public int get(int field) :返回给定日历字段的值
public abstract void add(int field ,int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year ,int month,int date):设置当前日历的年月日
异常
JVM的默认处理方案
如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理,把异常的名称,异常原因及异常出现的位置等信息输出在了控制台。程序停止执行
异常处理之 try…catch…
格式:
try{
可能出现异常的代码;
}catch (异常类名 变量名){
异常的处理代码;
}
执行流程:
程序从try里面的代码开始执行,出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理执行完毕之后,程序还可以继续往下执行。
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
private static void method() {
try {
int[] arr={1,2,3};
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("你访问的数组索引不在");
e.printStackTrace();
}
}
Throwable的成员方法
public String getMessage() :返回此throwable的详细消息字串符
public String toString() :返回此可抛出的简短描述
public void printStackTrace() :把异常的错误信息输出在控制台
编译时异常和运行时异常的区别
Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检和非受检异常所有的RuntimeException类以及子类被称为运行时异常,其他的异常都是编译时异常
编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一样处理
throws处理异常
虽然通过try…catch…可以对异常进行处理,但是并不是所有的情况,都有权限进行异常的处理也就是说,有些时候可以出现的异常时处理不了的,这个时候怎么办?
解决方法:Java提供了throws的处理方案
格式:
throws 异常类名;
注意:这个格式是跟在方法的括号后面的
编译时异常必须要进行处理,两种处理方案:try…catch…或者throws ,如果采用throws这种方案,将来谁调用谁处理
运行时异常可以不处理,出现问题后,需要回来修改代码。
throws和throw的区别
throws:
用在方法声明后面,跟的是异常类名
表示抛出异常,由该方法的调用者来处理
表示出现异常的一种可能性,并不一定会发生这些异常
throw:
用在方法体内,跟的是异常对象名
表示抛出异常,由方法体内的语句处理
执行throw一定抛出了某种异常
简历 冷熊简历 http://cv.ftqq.com/