/*练习题*/
/*建模:员工三个属性——姓名,工号,工资,经理也是员工除了三个之外还有一个奖金
属性,要求类中提供必要的方法进行访问
*/
abstract class Demo
{
String name;
int num;
double salary;
Demo(String name,int num,double salary)
{
this.name=name;
this.num=num;
this.salary=salary;
}
abstract void read(); //抽象方法强制让子类覆写其方法
}
class Worker extends Demo
{
Worker(String name,int num,double salary)
{
super(name,num,salary); //构造函数中子父类的super的应用
}
void read()
{
System.out.println("姓名是:"+name+",工号是:"+num+",工资有:"+salary);
}
}
class Manager extends Demo
{
double reward;
Manager(String name,int num,double salary,double reward)
{
super(name,num,salary);
this.reward=reward;
}
void read()
{
System.out.println("姓名是:"+name+",工号是:"+num+",工资有:"+salary+",奖金有:"+reward);
}
}
class Q1
{
public static void main(String[] args)
{
Worker w=new Worker("大秋",12345,3000);
w.read();
Manager m=new Manager("阿秋",11111,3000000,500000);
m.read();
}
}
//打印:
姓名是:大秋,工号是:12345,工资有:3000.0
姓名是:阿秋,工号是:11111,工资有:3000000.0,奖金有:500000.0
/*模版方法模式*/
//模版设计模式的核心思想:在定义功能时,有一部分是确定的,有一部分是不确定的,而且确定的要使用不确定的,那么将不确定的暴露出来,交给子类去完成。
abstract class GetTime
{
public final void getTime() //避免暴露出来的功能接口被覆写,用final修饰,强制使其不能被子类覆写
{
long start=System.currentTimeMillis();
runcode(); //学到了,要想获取方法中的内容,直接在方法中加入 其他方法名即可 例如 runcode()
long end=System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode(); //因为方法主体不明确,所以用抽象类表示,那么类也跟着用抽象类表示。
}
class SubTime extends GetTime
{
public void runcode() //子类的权限要比父类的大或相同
{
for (int x=0;x<3000 ;x++ )
{
System.out.println(x);
}
}
}
class Q1
{
public static void main(String[] args)
{
SubTime ss=new SubTime();
ss.getTime();
}
}
/*接口*/
//初期理解:当抽象类中所有的方法都是抽象方法时,那么可以用接口表示
interface 中的修饰符
其中修饰常量的是: public static final
修饰函数的是:public abstract
当然 interface 中这些修饰符是可以去掉的,不影响功能。
与抽象类相同,子类必须实现接口全部方法才能实例化,创建对象
class Student implements Inter //书写中可以看出,类Student不需要用abstract修饰
{
}
//为什么抽象类不能多继承而接口可以多实现,例如:implements Inter,Student
原因:当多继承抽象类时,相同方法名可能有不同方法体,jvm无法辨别,而多继承接口时,即使有相同的方法名没有方法体,则无方法体选择的困扰。
注意:
1.一个类在继承的同时还可以实现多个接口
class Demo extends Worker implements Inter,Manager
{
}
2.接口间的关系是继承
interface A extends interface B
{
}
3.接口可以多继承接口,接口不能多实现接口
原因很简单,都没方法体
java是存在多继承的,前提:只在接口与接口之间。
4.interface 是扩展功能,调用看实际需要而非强制
例如:
//被继承强制具有抽烟功能的Lisi
abstract class Student
{
abstract void study()
{
System.out.println("study");
}
void smoking()
{
}
}
class Lisi extends Student //首先Lisi继承了学生睡觉的功能之外还继承了抽烟的功能,但抽烟这个功能不是Lisi需要的,
{ //可是只要继承了,Lisi就会被强制的加入抽烟的功能,这时就可以用接口改变这种强制情况
public void study()
{
System.out.println("读书");
}
}
class Q1
{
public static void main(String[] args)
{
Lisi l=new Lisi();
l.study();
}
}
//通过接口改变情况的Lisi
abstract class Student
{
abstract void study()
{
System.out.println("study");
}
}
interface Demo
{
void smoking();
}
class Lisi extends Student implements Demo //需要该功能就实现接口即可
{
public void study()
{
System.out.println("读书");
}
}
class Q1
{
public static void main(String[] args)
{
Lisi l=new Lisi();
l.study();
}
}
//面试题
/*final修饰局部变量的问题*/
/*
1.final修饰局部基本变量
被final修饰的局部基本变量,基本的值不能发生改变
2.final修饰局部应用变量
被final修饰的应用类型的地址不能变,但是堆内存中的数值是可以改变的。
*/
class Student
{
int age=10;
}
class Q1
{
public static void main(String[] args)
{
int num=3;
System.out.println(num);
num=10;
System.out.println(num);
final int x=100;
System.out.println(x);
//x=1000;
System.out.println(x);
System.out.println("---------------------------");
Student s=new Student();
System.out.println(s.age);
s.age=100;
System.out.println(s.age);
}
}
/*final修饰变量的特点*/
1.被final修饰的变量只能赋值一次,变量为默认初始化值不属于赋值,即表示可以用构造代码块或者构造函数来赋值。
//复习先后顺序:静态代码块>(默认初始化值)>构造代码块>构造函数>成员函数
2.在构造方法完毕前给值
|
|