1. 继承?
Ø 为什么引入继承?可以提高代码的利用率
Ø 通过那个关键字实现继承?extends关键字
Ø Java支持单继承,如果想实现多继承?
第一种方式:间接继承
第二种方式:代码进一步进行抽象,放到接口(后面会详细讲解)中。
Ø 子类可以继承父类的属性或者方法?
有限制:
父类私有的属性和方法不能继承。是用private修饰符来修饰的
Public protected可以继承
Default在同一个包可以继承。
Ø 存在继承的话,在创建子类对象时(通过调用构造方法进行创建):
先调用父类的构造方法,然后调用子类的构造方法。
为什么子类创建对象时,需要创建父类?
2. static
Ø static来修饰成员变量:该成员变量隶属于类,在类加载时,会为该成员变量分配内存空间。
如何访问:规范的话,类名.静态成员变量名
而普通的成员变量是属于对象的。对象.成员变量名
案例:
publicclass StaticDemo01 {
//用static来修饰成员变量
privatestatic String staticArr="static成员变量";
//成员变量
private String arr="普通的成员变量";
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
StaticDemo01 s1=new StaticDemo01();
s1.arr="s1对象的成员变量值";
StaticDemo01 s2=new StaticDemo01();
s2.arr="s2对象的成员变量值";//第14行和第16行操作的是同一个arr吗?
System.out.println(s1.arr);
s1.staticArr="s1对象的成员变量值";
s2.staticArr="s2对象的成员变量值";//19行和20行操作的是同一个内存区域
System.out.println(s1.staticArr);
}
}
Ø static修饰成员方法:该方法隶属于类。
如何访问静态方法呢?类名.方法名();
Ø Static来修饰静态代码块
publicclass StaticDemo02 {
privatestaticintstaticA;
static{
//该代码块就是一个静态的代码块
//静态代码块的作用是什么?一般用静态代码块对静态的成员变量进行初始化。
staticA = 8;
//静态代码块什么时候执行?在jvm加载类的时候执行。而且仅执行一次
System.out.print("静态代码库执行...");
}
public StaticDemo02(){
System.out.println("构造方法执行.....");
}
/**
*@paramargs
*@throwsClassNotFoundException
*/
publicstaticvoid main(String[] args) throws ClassNotFoundException {
//加载类,会执行静态代码块里面的内容。
//Class.forName("com.inspur.javach6.StaticDemo02");
StaticDemo02 s1 = new StaticDemo02();
StaticDemo02 s2 = new StaticDemo02();
}
}
3. Final(最终)
Ø 修饰类:
如果修饰类,说明该类是最终类,所谓的最终类是指,不能被其他的类所继承。比如说String类。
Ø 修饰变量:(常量)
Final关键字是唯一可以修饰局部变量的关键字。
如果修饰变量,该变量不能改变?不能改变,是指的不能改变什么东西?不能改变的是地址。
publicclass FinalDemo01 {
privatefinal String str1="hello";
privatefinalint[] intArray={1,2,3};
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
FinalDemo01 f=new FinalDemo01();
f.str1 = "world";//改变的地址,所以不能改变
f.intArray[0]=3;//改变的内容,可以改变。
f.intArray = newint[3];//改变的地址,所以不能改变
}
}
Ø 修饰方法:
如果修饰方法,指该方法是最终的方法,不能被子类重写(覆盖)
4. this
每一个对象,都有一个引用,指向自己,这个引用就是this:
this关键字的作用:
1:调用被隐藏的成员变量。
publicclass Demo05 {
private String name="Rose";
public static void main(String[] args) {
Demo05 d = newDemo05();
d.print();
}
Public void print(){
//因为重名,所以局部变量就隐藏了成员变量
String name="Jack";
System.err.println("name is:"+name);//按最近访问的原则=Jack
//如果需要访问成员变量,必须要添加this,即这个类的的..
System.err.println("this.name:"+this.name);
}
}
publicclass Demo05 {
private String name="Rose";
public Demo05(String name){//接收一个参数的构造
//必须要使用this
this.name=name;
}
publicstaticvoid main(String[] args) {
Demo05 d = new Demo05("Mike");//传递参数调用构造-给成员变量设置值
d.print();
}
publicvoidprint(){
//因为重名,所以局部变量就隐藏了成员变量
String name="Jack";
System.err.println("name is:"+name);//按最近访问的原则=Jack
//如果需要访问成员变量,必须要添加this,即这个类的的..
System.err.println("this.name:"+this.name);
}
}
在一个方法中,所有的实例的成员或是实例的方法,前面没有this.默认也是有this:
2:返回自己的引用。(略)
3:调用另一个构造方法。
必须要在构造方法中。
必须要在在第一句。
publicclass Demo06 {
private String name;
public Demo06() {
//在构造的第一句,必须要是第一句,通过this调用另一个构造方法
this("unnamed");[H1]
System.err.println("已经调用完成了");
}
public Demo06(String name){
this.name=name;
}
publicstaticvoid main(String[] args) {
//要求,如果用户没有调用有参数的构造,
//则默认的名称为 unnamed,如果调用了有参数的构造,就是用户传递的名称
Demo06 d = newDemo06();
System.err.println(d.name);//Jack
}
}
5. super:指向父对象。
作用:
1:调用父类被隐藏的变量或是方法。
Class BlackDog extends Dog{
public String name="Jerry";
@Override
publicvoid run() {
String name="Jack";
//可以通过 super关键字,指定访问的是父类的变量
System.err.println("this.name:"+this.name+","+super.name);
}
}
2:在子类的构造方法中调用父类的构造。
Super关键字调用父类构造方法必须放在构造方法第一行?
在构造方法中this和super可以同时出现吗?不能
class Animal {
public Animal(String name) {
}
publicvoid run(){
System.err.println("4:Animal is Running..");
}
}
//此时,子类的默认构造,会去调用父类的默认构造,但父类没有默认构造
class Dog extends Animal{
//可以在子类中,通过super关键字,显式的去调用父类的某人构造
public Dog() {
super("Jack");
}
//如果父类没有默认构造,子中所有的构造方法必须要可以调用父类的构造
public Dog(inta){
this();//此处可以是super("Rose")也可可以是this().
}
}
classBlackDogextends Dog{
}