Java中可用的类修饰符有:public(公有) ,abstract'(抽象) ,final(不可改变),缺省。其中用public修饰类时,表示不管是否是该类所在的包都可访问该类;缺省则表示:只能在包含该类的包中使用该类。abstract表示该类是一个抽象类,只要类中有一个抽象方法,类都必须声明为抽象类。抽象类不可以实例化。final修饰类表示该类不可以被继承。
Java中成员变量和方法的访问权限修饰符有:public ,protected,缺省,private。
其中:
所有类中都可访问。
同一包中的所有类,以及不同包的该类的子类可以访问。
同一包中的所有类可以访问。
本类中可以被访问。
其他:
static:修饰变量,称为类变量或静态变量。静态变量是和类存在一起的,每个实例共享这个静态变量,在类加载时初始化。
final:被声明为final的变量必须在声明时给定初值,且在以后的引用中只能读取不能更改。修饰方法时,该方法不能被当前子类的方法覆盖。
此外:
访问权限修饰符以及static是不能用来修饰局部变量的,但final可以。
向上转型:
把子类赋值给超类对象时,通过该对象调用方法只能调用父类中含有的方法,属性也是父类中的属性。子类如果覆盖了父类的方法,则执行的是子类中实现的方法,子类若没有覆盖,则执行的是父类中的方法。
好处:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
package com.online.test3;
public class Parent {
int age=50;
String sex="男";
public void say(){
System.out.println("I am your father");
}
}
package com.online.test3;
public interface Mom {
static int a=0;
int b=1;//默认为静态
public void work();
}
package com.online.test3;
public class Daughter extends Parent implements Mom{
String interest="吃";
@Override
public void work() {
// TODO Auto-generated method stub
System.out.println("work"+"先做饭"+a+" "+b+" "+super.age);
}
public void study(){
System.out.println("晚上我要敲代码");
}
public void say(){
System.out.println("I am your daughter");
}
/**
* 子类转换赋值给父类对象。通过该对象调用方法只能调用父类中含有的方法,属性也是父类中的属性。
*
* 子类如果覆盖了父类的方法,则执行的是子类中实现的方法,子类若没有覆盖,则执行的是父类中的方法
* @param args
*/
public static void main(String[] args){
Mom m=new Daughter(); //把子类转成接口
m.work();//执行的是子类中的该方法
//m.say();/这是错误的,无法调用
//m.study();//这是错误的,无法调用
//m.interest//这是错误的,无法调用
Parent p=new Daughter();//把Daughter类转换成Parent,只能调用parent中含有的方法
p.say();//执行的是子类中的该方法
int age=p.age;
String sex1=p.sex;
//p.work();这是错误的,无法调用
//p.study();这是错误的,无法调用
Daughter d=new Daughter();//可以调用子类和从父类继承到的方法
int dage=d.age;
String in=d.interest;
int a1=a;
d.say();
d.work();
d.study();
}
}
执行结果:
work先做饭0 1 50
I am your daughter
I am your daughter
work先做饭0 1 50
晚上我要敲代码