Java中的关键字 - static,extends
(1)static关键字
static 关键字在Java中是静态的意思。用静态声明的属性和方法,可以被该类的任何对象调用,是所有对象所共有的属性。
模板类 :
package yau;
public class Person {
public static int count = 0;
private String name;
private int age;
public Person(){
count++;
}
public void work(){
}
}
场景类 :
import yau.Person;
public class Main {
public static void main(String[] args) {
Person p = new Person();
new Person();
new Person();
new Person();
new Person();
System.out.println("count = " +p.count);
System.out.println("count = " +Person.count);
}
执行结果为:
"C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" "-javaagent:D:\env\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=52181:D:\env\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_172\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\rt.jar;D:\yauproject\Demo01\out\production\Demo01" com.cn.ex.Main
count = 5
count = 5
Process finished with exit code 0
在代码中,count 是一个全局静态变量。用static声明的属性和方法,在内存中存放在方法去的永久代,所以通过类名可以调用,也可以通过对象进行调用。
但是用static声明的方法,不能调用对象中的属性和方法,因为这存在一个不确定性。
在创建对象时,static声明的属性和方法,在对象之前就存在,所以对象可以调用用static声明的属性和方法。当static声明的方法方法调用非static属性时,有时对象不存在,也就不存在该属性,所以static声明的方法不能调用非static声明的属性和方法。
(2)Java继承
(1)extends关键字
extends关键字,是子类继承父类时用到的关键字。本意为:拓展,Java中也可以理解为,继承
父类:
package yau;
public class Person {
private String name;
public int age;
public Person(){
System.out.println("创建父类对象!");
}
public void work(){
System.out.println("人可以工作!");
}
}
子类:
package yau;
public class Man extends Person{
public Man(){
System.out.println("创建子类对象");
}
public void work(){
age = 30;
System.out.println("男人工作要养家糊口!");
System.out.println("年龄:" +age);
}
}
场景类:
package com.cn.ex;
import yau.Man;
public class Main {
public static void main(String[] args) {
Man m = new Man();
m.work();
}
}
代码执行结果为:
"C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" "-javaagent:D:\env\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=52644:D:\env\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_172\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\rt.jar;D:\yauproject\Demo01\out\production\Demo01" com.cn.ex.Main
创建父类对象!
创建子类对象
男人工作要养家糊口!
年龄:30
Process finished with exit code 0
上述代码中,在 Man 类中并没有创建年龄属性,但我们可以对其进行操作,原因是子类继承了父类对象的共有属性和方法。而且在代码中可以看出在创建子类对象之前要先创建父类对象。子类对象便是在父类对象基础上的拓展。
(1)里氏替换原则(LIS)
里氏替换原则总的就是一句话,为:所有父类完成的工作子类也可以完成
package com.cn.ex;
class Man extends Person{
public Man(){
System.out.println("创建子类对象");
}
public void work(){
age = 30;
System.out.println("男人工作要养家糊口!");
System.out.println("年龄:" +age);
}
}
class Person {
private String name;
public int age = 10;
public Person(){
System.out.println("创建父类对象!");
}
public void work(){
System.out.println("人可以工作!");
}
}
public class Main {
public static void main(String[] args) {
Person p = new Man();
System.out.println("年龄为:" +p.age);
p.work();
}
}
代码执行结果为:
"C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" "-javaagent:D:\env\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=53174:D:\env\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_172\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\rt.jar;D:\yauproject\Demo01\out\production\Demo01" com.cn.ex.Main
创建父类对象!
创建子类对象
年龄为:10
男人工作要养家糊口!
年龄:30
Process finished with exit code 0
上述代码中,我通过创建父类对象,但是用子类对象进行实例化。通过代码我们可以发现:
(1)当调用普通方法时,执行的时用 new 实例化的方法,也就是子类方法。
(2)不能调用子类独有的方法。
(3)但调用的属性便是父类的属性。
(3)Java中的继承规则
在Java中可以链式继承(多重继承),但不允许多继承。
在Java中不允许,子类即继承父类又继承祖宗类。只能父类继承祖宗类,子类继承父类,呈链式方式继承。