静态方法只能访问静态的成员,不可以直接访问实例成员。
实例方法可以访问静态的成员,也可以访问实例成员。
静态方法中是不可以出现this关键字的。
静态代码块:
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,会比main方法先加载,并且自动触发、只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。
public class Student extends People {}
1.子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
2.Java是单继承模式:一个类只能继承一个直接父类。
3.Java不支持多继承、但是支持多层继承。
4.Java中所有的类都是Object类的子类。
虽然调用不了,但是还是继承了
package com.itheima.d9_extends_feature;
public class ExtendsDemo {
public static void main(String[] args) {
// 子类是否可以继承私有的属性和行为呢?我认为可以的
Student s = new Student();
// System.out.println(s.age);
// s.run();
}
}
class People{
private int age = 21;
private void run(){
System.out.println("人跑的很快~~");
}
}
class Student extends People{
}
先子类局部范围找
然后子类成员范围找
然后父类成员范围找,如果父类范围还没有找到则报错。
可以通过super关键字,指定访问父类的成员。
package com.itheima.d10_extends_field_method;
public class ExtendsDemo {
public static void main(String[] args) {
Wolf w = new Wolf();
System.out.println(w.name); // 子类的
w.showName();
}
}
class Animal{
public String name = "父类动物";
}
class Wolf extends Animal{
public String name = "子类动物";
public void showName(){
String name = "局部名称";
System.out.println(name); // 局部的
System.out.println(this.name); // 子类name
System.out.println(super.name); // 父类name
}
}
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
1.@Override是放在重写后的方法上,作为重写是否正确的校验注解。
2.加上该注解后如果重写错误,编译阶段会出现错误提示。
3.建议重写方法都加@Override注解,代码安全,优雅!
1.重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
2.私有方法不能被重写。
3.子类重写父类方法时,访问权限必须大于或者等于父类 (暂时了解 :缺省 < protected < public)
4.子类不能重写父类的静态方法,如果重写会报错的。
权限修饰符
这个只能导入show4,因为show3是是其他包的子类(如zi),Demo在第一个是父类。
final的使用
常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
public class Constant {
public static final String SCHOOL_NAME = “传智教育";
public static final String LOGIN_NAME = “admin";
public static final String PASS_WORD = “123456";
}
常量的执行原理:
1.在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量。
2.这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的。
好处:
代码可读性好,实现了软编码形式。
枚举是Java中的一种特殊类型
枚举的作用:“是为了做信息的标志和信息的分类”。
枚举的特征:
枚举类都是继承了枚举类型:java.lang.Enum
枚举都是最终类,不可以被继承。
构造器都是私有的,枚举对外不能创建对象。
枚举类的第一行默认都是罗列枚举对象的名称的。
枚举类相当于是多例模式。
在Java中abstract是抽象的意思,如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),这个类必须用abstract修饰,被称为抽象类。
public abstract class Animal{
public abstract void run();
}
抽象的使用总结与注意事项:
1.抽象类可以理解成类的不完整设计图,是用来被子类继承的。
2.一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
有得有失: 得到了抽象方法,失去了创建对象的能力。
final和abstract是什么关系?
互斥关系
1.abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。
2.抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。
模板方法模式实现步骤:
把功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码。
模板方法中不能决定的功能定义成抽象方法让具体子类去实现。
接口的格式如下:
接口用关键字interface来定义
public interface 接口名 {
// 常量
// 抽象方法
}
JDK8之前接口中只能是抽象方法和常量,没有其他成分了。
接口不能实例化。
接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化。
接口的用法:
接口是用来被类实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类。
修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
}
实现的关键字:implements
从上面可以看出,接口可以被类单实现,也可以被类多实现。
接口实现的注意事项:
一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类
基本小结:
类和类的关系:单继承。
类和接口的关系:多实现。
接口和接口的关系:多继承,一个接口可以同时继承多个接口。
接口多继承的作用:
规范合并,整合多个接口为同一个接口,便于子类实现。
SportMan接口继承People和Law两个接口,然后BasketbakkMan只用实现SportMan,就能四个方法全部实现
JDK8开始后新增了那些方法?
默认方法:default修饰,实现类对象调用。
静态方法:static修饰,必须用当前接口名调用
私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。
他们都会默认被public修饰。
注意:JDK8新增的3种方法我们自己在开发中很少使用,通常是Java源码涉及到的,我们需要理解、识别语法、明白调用关系即可。
同类型的对象,执行同一个行为,会表现出不同的行为特征。
优势:
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
Animal a = new Dog();
a.run(); // 后续业务行为随对象而变,后续代码无需修改
多态下要想使用子类的独有功能,得用强制类型转换
强制类型转换:子类 对象变量 = (子类)父类类型的变量
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换
类型转换异常:ClassCastException – 强制转换后的类型不是对象真实类型则报错。
本质上是一个没有名字的局部内部类,定义在方法中、代码块中、等。
作用:方便创建子类对象,最终目的为了简化代码编写。
Animal a = new Animal() {
public void run() {
}
};
a. run();
相当于把原来要额外弄创建的子类,直接通过定义的方法创建
如,把这里的Student的内容放到上面
接口不能直接创建对象,所以这里通过重写方法来创建。
就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了。
Object类的方法是一切子类对象都可以直接使用的,所以我们要学习Object类的方法。
一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
Object类的常用方法:
public String toString() //默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址
public boolean equals(Object o) //默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false
equals存在的意义:
父类equals方法存在的意义就是为了被子类重写,以便比较2个子类对象的内容是否相同。
public static boolean equals(Object a, Object b) // 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较
public static boolean isNull(Object obj) // 判断变量是否为null ,为null返回true ,反之
对象进行内容比较的时候建议使用什么?为什么?
1.建议使用Objects提供的equals方法。
2.比较的结果是一样的,但是更安全。
StringBuilder是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接、修改等。
如果用String类来拼接,每次都new StringBuilder();再添加上去
而 StringBuilder是直接在一个地方操作,不用反复生成新的
包含执行基本数字运算的方法,Math类没有提供公开的构造器。
如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用
解决浮点型运算精度失真问题。
BigDecimal的对象如何获取?
BigDecimal b1 = BigDecimal.valueOf(0.1);
因篇幅问题不能全部显示,请点此查看更多更全内容