1:继承相关知识点
继承中变量的访问:在子类中访问一个变量,先在子类局部变量找,然后子类成员变量找,最后在父类成员变量找(不考虑到父类的父类)
super与this:this访问本类成员变量,super访问父类成员变量
继承中构造方法的访问特点:子类的(无参,带参)构造方法都会先访问父类的无参构造方法。因为子类继承自父类,可能会用到父类的数据,所以子类初始化前一定会先初始化父类。子类的每个构造方法第一句都是默认super()
如果父类只有带参构造方法,那么子类的构造方法可以用super(XX)调带参的构造方法,完成父类的初始化,或者在父类写个无参的
继承中成员方法的访问:通过子类对象访问成员方法,先在本类找,然后在父类找(不考虑父类的父类)
方法重写:子类和父类有相同声明的方法,子类的方法重新编写了方法体完成自己独有的功能。(顺便说下在可以通过super.XX去调用父类的该方法)
@Override:重写的注解,在重写方法前加上这个,如果子类的方法声明在父类找不到,会报错,可帮助我们检查代码
重写注意事项:父类的私有方法不能被重写(父类的私有成员子类也是不能继承的)
继承注意事项:java是单继承,不支持多继承,支持多层继承
2:权限修饰符
3:Final修饰符:final可以修饰类,方法,变量,用它修饰过的类,方法,变量(用final修饰了应该叫常量)不可改变
修饰类时,类不能被继承
修饰变量,变量变成常量,不能再次赋值改变。包括类变量(静态)和实例变量(非静态),修饰的变量必须定义时赋值,或者在构造方法里赋值(即在类初始化前完成赋值)
修饰方法时,方法不能被重写
4:static修饰符
可以修饰成员方法成员变量,特点:被类的所有对象共享,这也是我们判断是否是否static的关键
访问特点:非静态的成员方法可以访问静态非静态的成员方法成员变量,而静态的成员方法只能访问静态的成员变量或成员方法(记住这句关键的就行,前面的都是正常情况)
子类的对象可以访问父类的静态对象和静态方法(这个我的IDEA没有提示,但是敲出来运行没错)
子类对象不能继承(自然也就不能重写)父类的静态方法
编译时分配内存,就一直存在,程序退出才会释放。子类如果定义了相同的静态方法,会重新开辟出一块内存空间,并不是重写,知识名称重复
5:多态
继承关系,有方法重写,父类对象指向子类对象
例如假设Teacher继承自Person,Person p=new Teacher();
此时,父类对象访问成员变量,编译运行都看父类的结果(假如子类对该变量重新赋值),不能访问子类独有的变量
父类对象访问成员方法,编译看父类,执行结果看子类,不能访问子类独有的方法
多态好处:提高了程序的扩展性,定义方法的时候,使用父类型作为参数,使用的时候,子类型对象参与操作。(不能调用某些子类独有的方法)
多态转型: 父类引用指向子类对象,向上转型。例如Person p=new Teacher();
父类引用转为子类对象,向下转型。例如Teacher t=(Teacher)p;//t然后可以调自己独有的方法,也不用再new一个对象
6:抽象类
没有方法体的方法我们用abstract将其定义为抽象方法,含有抽象方法的类是抽象类,也需要用abstract修饰
抽象类不一定含抽象方法,但含抽象方法的类一定是抽象类,抽象类可以含有非抽象方法
抽象类的子类:要么重写父类的抽象方法,要么本身还是抽象类
抽象类不能直接new,需要通过父类对象指向子类对象的方式
抽象类成员特点:可以有变量常量,可以有抽象非抽象方法,有默认构造方法,用于父类对象指向子类对象,子类对象访问父类对象的数据的初始化
7:接口
接口:对行为的抽象,关键字,implements
接口的实例化也是采用多态的形式,指向实现接口的类的对象
接口的成员特点:成员变量,只能是常量,默认修饰符,public static final.
没有构造方法。一个类如果没有父类,会默认继承自object
成员方法默认是抽象方法,默认用public abstract
类与接口:一个类支持同时实现多个接口。接口也可以继承接口,支持多继承
抽象是对事物的抽象,接口是对行为的抽象。具体使用的时候可以把共性放入抽象类,特有的行为放入接口
8:形参与返回值
类作为形参和返回值,前者是需要传入一个该类的对象,后者是返回一个该类的对象
抽象类作为形参和返回值,需要的和返回的都是子类对象,事先先通过多态的形式实例化抽象类
接口作为形参和返回值,需要的是该接口的实现类对象,事先也是通过多态的形式实例化接口
9:内部类的相关知识点
内部类的定义:在类中定义一个类
内部类的访问:内部类可以直接访问外部成员,包括私有。外部想访问内部类的成员,必须先创建对象 (在本类访问自己的内部类,直接Inner n=new Inner();下面的Outer.Inner的形式是在另一个类中 的访问)
内部类分类:按定义的位置不同,分为成员内部类(类的成员位置)和局部内部类(定义在方法里的)
注意:成员内部类不能含有static的变量和方法
如果一个类的成员内部类是私有的,上面的就无效的,可以在该类写个方法创建对象调用内部类,外部调用该方法
局部内部类:不加修饰符,外界调用直接调用这个包含类的方法,该类的调用在该内部类 声明下面正常创建该类的对象,然后调用该内部类的方法
注意,局部内部类想要使用局部变量,该变量必须声明为final内型
匿名内部类:(匿名内部类是局部内部类的一种特殊形式,所以也写在方法里面)前提--存在一个类或者接口,这里的类可以是具体类或者抽象类(本质是一个继承了或者实现了类或接口的匿名对象),new 类名或者接口名(){重写方法},要掉该重写方法,直接在
匿名内部类的后面调用就行。
例如 new Inner(){ public void show(){} }.show//调用匿名内部类的方法
new Inner()相当于Inner的实现类,所以我们可以用 Inner i=new Inner(),用一个对象去接收(注意这里是用的多态,),然后i.show()这种方式来调用内部的方法
匿名内部类在开发中的使用
10:Math接口
11:System接口
12:Object类
Object类是所有类的超类
构造方法有一个默认的无参构造方法
object类的方法如下
toString方法,一般会返回调用者的类名和内存地址,一般为了方便调试,直接按IDEA自动生成重写的tosting即可,返回类对象属性的赋值情况。
13:Arrays
14:基本类型包装类
将基本类型封装成对象的好处是可以在对象中定义更多的方法操作该数据
常用的操作之一,用于基本类型和字符串之间的转换
基本类型除了int变 Integer,char变Character,其余的不变,首字母大写
int的包装类Integer ,两个构造方法都已经过时,使用Integer类的静态方法进行类型转换,valueOf(int)或者valueOf(String) 。
int与String互转
Int-->String ,valueOf(int i),该方法是String类中的方法
String-->int, parseInt(String i),该方法是Integer类中的方法
自动装箱与拆箱
装箱:把基本类型转换成对应的包装类,例如Integer I =100,会把基本类型自动转换成对应Integer类,底层也是valueof,jdk5之后自动转了
拆箱:把包装类转换成对应的基本类,例如Integer i=100;i=i+100,i+100先自动拆箱,然后整体的值赋给i又自动装箱
15:date
Date date =new Date();
Sout(date);
对于第一个构造方法,构造一个时间对象,直接输出即可获得当前系统时间
对于第二个构造方法,构造一个时间对象,如果传入0,那么输出的就是基准时间,传入多少,输出的就是在基准时间上加多少
例如 long d=60*60*1000;
Date date=new Date(d);
输出的就是1970年9点,由于时区的关系,会多8个小时
16:SimpleDateFormat
它是一个格式化和解析日期的类,jdk文档中一共有4个构造方法,这里举两个例子。
然后下面的format和parse也都是它的方法
Date d =new Date();
SimpleDateFormat sf=new SimpleDateFotmat();
String s=sf.format(d);
Sout(s);
此时输出的是当前系统时间,但是SimpleDateFotmat会有默认的输出格式
如果需要指定格式,在new对象的时候传入时间格式,例如“yyyy-MM-dd HH:mm:ss”
这时候输出时间就是按照这个格式了
将日期字符串解析成date对象
String s="2020:10:22 20:32:12";
SimpleDateFormat sd=new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
Date d=sd.parse(s);
Sout(d);
注意字符串中的时间格式是什么样的,new simpleDateFormat的时候就要写一样的格式,不然会有问题
17:Calendar日历类
Calendar为某一时刻与日历字段之间的转化提供了一些方法,并为操作日历字段提供了一些方法
Calendar提供了类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化
Calendar cal=Calendar.getInstance();
Int year=calendar.get(Calendar.YEAR);
Int month=calendar.get(Calendar.MONTH)+1;
Int day=calendar.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+day+"日");
注意:moth是从0开始算
第二个方法可以修改一些字段,例如传入(Calendar.YEAR,-4),再输出当前的日期,输出的日期就比现在日历的日期小4年。
18:异常
异常类的继承关系
Try{
可能出问题的代码
}catch(异常所在的类,e)
{//打印异常有三种方式
Sout(e.toString());//sout(e.getMessage());e.printStackTrace();
}
运行时异常与编译时异常
所有的RuntimeException及其子类都是运行时异常, 其它都是编译时异常
编译时异常:必须先处理,否则无法编译
运行时异常:可处理可不处理,运行时出问题再来处理也可。
throws在方法后面抛出异常,这种方式,方法无法向下继续运行。谁调用这个方法,谁还得继续用try catch进行处理
---
自定义异常
Public class 异常类名 extends Exception
{
无参构造
带参构造
}
自定义运行时异常继承RuntimeException类,自定义编译时异常继承Exception类。这里有个问题不是很清楚,RuntimeException也是继承自Exception类的,如果说分别继承两个平级的代表两个不同类型的,这样还好理解点。
IDEA的操作,在创建类,继承写完之后,然后在右键generate-Constructor,全选生成即可
Public class ZDYException extends RuntimeException{
Public ZDYException(){
}
Public ZDYException(Stringmessage){
super(message);
}
}
这里我只粘两个构造方法,其实自动生成的还有好几个
Public static void check(intscore)
{
if(score>100||score<0)
Throw new ZDYException("分数不合格");
else
System.out.println("正常");
}
Public static void main(String[]args){
Scanner sc=new Scanner(System.in);
Int s=sc.nextInt();
try{
check(s);
}catch(Exception e)
{
e.printStackTrace();
}
}
注意,上面的虽然在check方法进行了简单的逻辑检查,使用了自定义的异常抛出一个异常打印一条语句。但是在下面仍是要try catch去写,如果下面不写trycatch异常的话,程序是
Process finished with exit code 1异常退出,写了的话是Process finished with exit code 0正常退出