A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿秋 中级黑马   /  2015-8-16 10:06  /  379 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*练习题*/
/*建模:员工三个属性——姓名,工号,工资,经理也是员工除了三个之外还有一个奖金
属性,要求类中提供必要的方法进行访问
*/
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.在构造方法完毕前给值


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马