一.Static
一 定义:
叫静态,可以修饰成员变量、成员方法
成员变量按有无static修饰,分为两种:
类变量:有static 修饰,属于类,在计算机里只有一份,会被类的全部对象共享。
实例变量:无static修饰,属于每一个对象。
static变量使用:
类变量:
类名.类变量(推荐)
对象名.类变量(不推荐)
实例变量:
对象.实例变量
static方法使用:
类方法(静态方法):
属于类,可以直接用类名访问,也可以用对象访问
类名.类方法(推荐)
对象名.类方法(不推荐)
无static修饰的成员方法:
实例方法 (对象的方法):
属于对象,只能用对象访问
对象名.实例方法
(拓展:main方法也是类方法)
类方法的应用场景
可以用来设计工具类
是什么:工具类中的方法都是类方法,每个类方法都是为了完成一个功能的
好处:提高了代码的复用性,调用方便,提高了开发效率
对比:实例方法需要创建对象进行调用,会浪费内存
建议:工具类不需要创建对象,建议将工具类的构造器私有化
注意事项
类方法中可以直接访问类的成员,不可以直接访问实例成员
实例方法中既可以直接访问类成员,也可以直接访问实例成员
实例方法中可以出现this关键字,类方法中不可以出现this关键字
二 代码块的概述
代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类)
代码块分为两种:
静态代码块
格式:static{}
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也就会执行一次
作用:完成类的初始化,例如:对类变量的初始化赋值
实例代码块
格式:{}
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对对象的初始化,例如:对实例对象进行初始化赋值。
应用:记录对象创建的日志
三 单例设计模式
设计模式指的是具体问题的最优解法
确保一个类中只有一个实例
单例要求:
1.把类的构造器私有化,防止外部通过 new
创建新实例;
2.定义一个类变量存储类的一个对象;
3.提供一个类方法返回对象
单例应用场景:
任务管理器,获取运行时的对象
使用单例好处:
可以有效避免浪费内存
饿汉式单例特点:
获取类的对象时,对象已经创建好了
懒汉式单例特点:
拿对象时才开始创建对象
饿汉式单例代码
public class Test {public static void main(String[] args) {A a1=A.getObject();A a2=A.getObject();System.out.println(a1);System.out.println(a2);} }
public class A {//1.必须私有类的构造器private A(){}//2.定义一个类变量记住类的一个对象private static A a=new A();//3.定义一个类方法返回类的变量public static A getObject(){return a;} }
懒汉式单例代码
public class Test2 {public static void main(String[] args) {B b1= B.getInstance();B b2=B.getInstance();System.out.println(b1==b2);} }
public class B {//2.定义一个类变量,用于存储这个类的一个对象private static B b;//1.把类的构造器私有化private B(){}//3.定义一个类方法,确保这个方法保证第一次调用菜创建一个对象,后面调用时会返回同一个对象public static B getInstance(){if(b==null){System.out.println("第一次创建对象~");b=new B();}return b;}}
注意事项:单例对象频繁使用时采用饿汉式单例代码,很少用到时采用懒汉式单例代码
二.继承
一 定义:
1.继承就是extends关键字,让一个类和另一个类建立的一种父子关系
2.子类可以继承父类的非私有的成员
特点:
子类继承父类的非私有化成员(成员变量,成员方法)
继承后对象的创建是子类和父类共同完成的
好处:
减少重复代码代码的编写,提高代码的复用性
继承注意事项:
1.Java是单继承的,一个类只能继承一个直接父类;Java中的类不支持多继承,但是支持多层继承。
2.Object类是Java中所有类的祖宗
二 方法重写
原因:当子类觉得父类中的某个方法不好用时,或者无法满足自己的要求时,子类可以重写一个方法名称,参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
注意:重写后,方法的访问,Java会遵循就近原则。
方法重写其它注意事项:
1.重写小技巧:使用@Override注解,检查我们方法重写的格式是否正确,代码可读性也会更好。
2.子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限。
3.重写的方法返回值类型,必须被重写方法的返回值类型一样,或者范围更小。
4.私有方法,静态方法不能被重写,如果重写会报错。
三 子类访问成员的方法
在子类中访问其它成员(成员变量,成员方法),是依照就近原则的。
1.先子类局部范围找
2.然后子类成员范围找
3.然后父类成员范围找,如果父类范围没有找到则报错
如何在子类中优先使用父类成员:
可以通过super关键字,指定父类的成员:super.父类成员变量/父类成员方法
四 子类构造器
特点:
子类中的全部构造器,都必须先调用父类构造器,再执行自己。
子类构造器特点代码
class A { // public A(){ // System.out.println("父类A构造器执行了"); // }public A(String name,int age){} } class Z extends A{public Z(){//super();默认存在super("123",34); //解决父类没有默认构造器System.out.println("子类Z无参构造器执行了");}public Z(String name){//super();默认存在super("123",34); //解决父类没有默认构造器System.out.println("子类Z有参构造器执行了");} }public class Test {public static void main(String[] args) {Z z=new Z();Z z1=new Z("名字");} }
应用场景
子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先进行初始化赋值,再回来把对象里包含子类这部分的数据页进行初始化赋值。
补充:this(….)调用兄弟构造器
任意类的构造器中,是可以通过this(…)去调用该类的其他构造器的
this(….)调用兄弟构造器代码
public class Test2 {public static void main(String[] args) {Student student=new Student("张三",12);System.out.println(student.getName());System.out.println(student.getAge());System.out.println(student.getSchoolName());} } class Student{private String name;private int age;private String schoolName;public Student() {}public Student(String name,int age){this(name,age,"黑马程序员"); //this(…)调用兄弟构造器}public Student(String name, int age, String schoolName) {this.name = name;this.age = age;this.schoolName = schoolName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;} }
注意:super和this不能出现在同一构造器中,且放在第一行