一个标准类的定义:
1)私有化变量:
被private修饰的成员变量/成员方法,只能在本类中访问,外界不能够直接访问
2)提供有参或无参的构造方法;
(1)作用:给对象进行初始化;
(2)特点: (1)与方法名相同;
(2)构造方法可重载;
(3)当你没有自己重写构造函数时,系统会默认给你添加一个无参的构造函数;
(4 ) 没有具体的返回值,也没有返回值类型,连void也没有
(3)注意事项: (1)方法名必须与类名相同;
(2)一般用public修饰,没有返回值;
(3) 当写一个标准类的时候,没有提供无参构造方法,系统默认会提供无参构造
(4) 假设给出类有参构造,系统不会提供无参构造
(4)构造方法中不能写return语句,因为它没有返回值,也没有返回值的类型,void也没有
3)提供一些公共的可供访问成员变量的方法 例 setName() / getName()
*********面试题:
Student st = new Student(); 创建这个学生对象做了几件事???
赋初值的两种方法:
方式1: 无参构造+setXXX()进行赋值
方式2: 直接调用有参构造进行赋值
关键字 static : 静态的,共享的
特点:随着类的加载而加载(与类有关系)
1)被static修饰的成员变量和方法,都优先于对象存在;
2)被static修饰的成员变量和方法,都可被多个对象共享;
3)被static修饰的成员变量和方法,都可被类名直接调用;类名.成员变量/方法
static的注意事项:
1)在静态方法中:
成员变量只能访问静态成员变量
成员方法只能访问静态成员方法
在非静态方法中:
成员变量可以访问静态和非静态的成员变量
成员变量可以访问静态和非静态的方法;
2)在静态方法中没有 this 关键字 ,被静态修饰的成员变量和方法随着累的加载而加载,优先于对象存在
被 static 修饰的内容一般称为 类成员 , this 随着对象的创建而创建;
( 静态方法中不用this是无法引用除自己方法体中定义的成员和参数以外的非静态变量或者方法的。
静态方法是不允许被子类重写的,但是子类可以覆盖父类的静态方法。
子类也不可将父类中的非静态方法重写为静态方法。
main方法也是静态方法,在main方法中访问类中的成员变量和方法,需要在方法体中创建类的对象 )
static 的内存分配图解
JDK文档使用说明
1)进入jdk文档之后
点击显示--->索引---->查询哪个类 比如String
找到官方提供的类
需要观察什么?
1)该类中有没有字段
2)看当前类中有没有构造方法(一旦有构造方法,那说明可以通过这些构造方法创建该类对象)
3)有没有成员方法
2) 制作属于自己的文档说明书:
(1)定义一个工具类,里面包含了构造方法(私有private)和成员方法(静态static);
(2)在工具类中必须是文档注释(/** 说明内容 */),这样 jvm 才会把它解析成文档
例:
(3) 编写好文档说明书之后,打开dos命令窗口,进入到当前的工作目录;
javadoc -d (创建一个文件夹)doc -author(作者可写可不写) -version(版本号) xxx.java(刚编写好的java文件)
继承(extends):将一些类的共性内容提取出来, 封装成到一个独立类中
并使这个独立类与这些类产生关系
1)格式: class 子类名(派生类) extends 父类名(超类){ }
所有类的超类是 Object类
2)特点: Java只支持单继承,不支持多继承
但可以支持多层继承
例:
class GrandFather{
System.out.println("我是老子的老子");
}
class Father extends GrandFather{
System.out.println("我是老子");
}
class Son extends Father{
System.out.println("我是小子");
}
3)继承的使用注意事项:
(1)子类继承父类时,只能继承父类的非私有的成员变量和方法;
(2)子类继承父类时,不能继承父类的构造方法,
只能通过 super()/super(参数...) 间接访问父类的构造方法
(3)不要为了部分而去使用继承,只有当继承与被继承是 “is a”的关系时才使用继承;
即一个类包含另一个类的全部;
(4)子类继承父类时,当子类成员变量和父类的成员变量不一致时分别输出即可
当子类成员变量和父类的成员变量一致时:
1)先在子类的局部变量寻找是否有同样名称的变量,有,就输出,
2)若没有,就在子类的成员变量中寻找是否有同样名称的变量,有,就输出,
3)若没有,就去父类的成员变量中寻找是否有同样名称的变量,有,就输出,
4)若还找不到,就报错(即使父类的局部变量中有同样名称的变量也报错,无法访问)
(5) 子类继承父类时,子类的所有构造方法都默认的访问父类的无参构造方法
4)继承的好处:
(1)提高代码的复用性;
(2)后期利于维护;
(3)继承是多态的前提;
5)Java的开发原则:低内聚,高耦合
低内聚: 尽量降低类和类之间的关系,提高类的独立性;
高耦合:尽可能的提高完成功能的执行能力;
*******面试题:
子类继承父类的时候,如果父类的无参构造方法没有给出?会怎么样?
答:1)代码会报错!!!
2)解决办法:
方式一:在父类中手动给出父类的无参构造方法;
方式二:在子类的构造方法中通过 super(有参) 间接访问父类的有参构造方法;
方式三:先在子类的无参构造方法中通过 this(有参) 调用自己的有参构造方法,
再在子类的有参构造方法通过 super(有参)间接访问到父类的有参构造方法;
this 和 super 的应用场景:
1)成员变量:
this.成员变量
super.成员变量
2)构造方法:
this() / this(有参)
super() / super(有参)
代码块:
1)局部代码块:
在方法中定义的代码块 格式 : { 代码 }
作用:限定变量的生命周期,只在{ }内有效
2)构造代码块:
在类的成员变量中定义,格式:{ 代码 }
每次执行构造方法时,先找有没有构造代码块,如果有,就先执行构造代码块,再执行构造方法
作用:如果多个类的构造方法中有共同的内容,可抽取出来放到同一个构造代码块中;
3)静态代码块:
在类的成员变量中定义,格式 : static { 代码 }
随着类的加载而加载,优先于对象存在;并且只执行一次,之后不再执行静态代码块;
作用:主动执行一些在项目启动时就要执行的代码;
******面试题:
静态代码块,构造代码块,构造方法之间的优先级?
答:1)静态代码块--->2)构造代码块---->3)构造方法
对象的初始化顺序:
首先执行父类静态的内容--->父类静态的内容执行完毕后--->接着去执行子类的静态的内容--->当子类的静态内容执行完毕之后--->再去看父类有没有非静态代码块(构造代码块)--->如果有就执行父类的非静态代码块(构造代码块)--->父类的非静态代码块(构造代码块)执行完毕--->接着执行父类的构造方法--->父类的构造方法执行完毕之后--->它接着去看子类有没有非静态代码块--->如果有就执行子类的非静态代码块--->子类的非静态代码块执行完毕--->再去执行子类的构造方法。
总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用 super 关键子来调用父类带参数的构造方法,否则编译不能通过。