随笔 - 19  文章 - 0  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

     摘要: 1 Java的环境配置 day01 2 3 1. 环境配置有如下的三种方法: 4 a) 我的电脑属性: 从path 环境中配置 5 b) 利用临时的变量设置: set path = java的所在路径\bin%d% 6 c) 定义批处理文件 : 设置步骤如下: 7 a) set path = %cd%\H:\java\jdk1....  阅读全文
posted @ 2012-08-07 01:04 、小细 阅读(138) | 评论 (0)编辑 收藏

面试题:请说说抽象类和接口的区别


抽象类,使用abstract关键字修饰的类为抽象类,一般来说,含有抽象方法的类就需要定义为抽象类,但是抽象类不一定都有抽象方法,比如,在GUI当中,对于事件处理提供了很多监听器口里里面方法都是抽象的,每次进行事件处理时,都需要实现监听器接口,哪怕只处理一个简单的动作,也需要实现接口所有的方法,这样很麻烦,而且显得代码很臃肿,Java提供了适配器,适配器就是自己实现了监听器接口,但是所有的方法都是空实现,以后再用到监听器时,我们可以继承适配器,实现我们需要的方法就可以了,这样就很方便。像这样的适配器只是给调用者提供一个方便,一定不希望别人直接创建实例来使用,所以有必要将它定义为abstract抽象的。

接口,接口是一种特殊的抽象类,接口中所有的方法都是抽象的,通常来讲,我们使用接口作为一种协议,起到各模块之间的衔接作用。由于Java中只支持单继承,不支持多继承,但是可以实现多个接口,原因在于接口中所有的方法都抽象,子类继承哪个都无所谓,我们让一个类实现多个接口,就可以做到将一个子类对象当做多种父类类型来使用,所以我认为定义接口就是为了更好地实现多态,因为多态就是把子类当做父类来用.

 

posted @ 2012-08-07 01:01 、小细 阅读(65) | 评论 (0)编辑 收藏
 1 /*
 2     子类对象的实例化过程
 3     我们可以用一个类的变量记住它的子类的子类的实例.这时如果调用子类中的方法,只需要强制转换子类就可以
 4     没必要非得强制转换子类的子类.
 5     instanceof关键字:也可以判断子类实例也属于父类的类型.
 6 */
 7 
 8 class A
 9 {
10     A()
11     {
12         //如果程序没有写构造方法的/java会默认给它添加构造方法!
13     }
14     public void a()
15     {
16             System.out.println("a() in A");
17     }
18 }
19 
20 class B extends A
21 {
22     B()
23     {
24         super(); //默认调用父类的无参的构造方法!
25     }
26     public void a()
27     {
28             System.out.println("a()in B");
29     }
30 
31     public void b()
32     {
33             System.out.println("b()in B");
34     }
35 
36 }
37 
38 class C extends B
39 {
40     public void a()
41     {
42             System.out.println("a()in C");
43     }
44     public void b()
45     {
46             System.out.println("b()in C");
47     }
48     public void c()
49     {
50             System.out.println("C()int C");
51     }
52 }
53 class Demo 
54 {
55     public static void main(String[] args) 
56     {
57         A a = new C();
58         if(a instanceof C)
59         {
60             C c =(C)a;
61             c.c();
62         }
63         if(a instanceof B)
64         {
65             B b = (B)a;
66             b.b();
67         }
68     }
69 }
/*
    继承的细节
    1.子类不会继承与父类的私有的成员
    2.构造函数是不会被继承.
    3.只支持单继承,可以多重继承.

    ------------------
    1.以后在设计一个类的时候,父类一定要加上一个不带参数的super,否则子类实例化的时候会报错!
    为什么有这样一个机制:
    解答:别人来继承与这样一个类,一定也需要这个子类具有父类的方法.但是别人并不知道在构造函数里面做了一些特别才能实现这个
    的功能.所以java就规定子类实例化的过程中.一定会默认调用与父类的super()的构造方法.如果你在父类中没有定义一个无参的.
    那么在实例化的过程中是会容易出错的.
*/

class Person
{
    private String name ;
    public Person(String name)
    {
        this.name = name;
    }
    public  Person()
    {
            //咱们加一个无参的构造方法!
    }
    public    void eat()
    {
            System.out.println("是人都要吃东西!");
    }

}

class Student extends Person
{    
    public Student()
    {
        //不带参数的构造函数!
        super(); //默认为这个?  但是有这个父类的构造函数吗?显然没有对吧.。
    }
    public void eat()
    {
            System.out.println("抽一根");
            super.eat();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Student st = new Student();
        st.eat();
    }
}
/*
    子类的实例化过程:子类在创建做了什么事情呢?
    解答:在创建子类的时候,会调用子类的构造函数,在子类构造函数的第一行会默认调用父类的构造函数
                在子类构造函数中如果没有显式地调用父类的构造函数.它会自动的调用父类的无参的构造函数(在这个问题上你要注意)
            我们可以在构造函数中使用this(实参)来调用自己的带参数的构造方法
            还可以用super(实参)去调用父类型的带了参数的构造方法/
            但要注意:this 与super()只能出现一次.  并且在第一行.
            如果一个构造函数调用了this ,那么就不能从第二个语句使用super()
*/


class Person
{
    private String name ;
    public Person()
    {
            System.out.println("无参的Person()被调用啦!");
    }
    public Person(String name )
    {
        this();
        System.out.println("有参的Person()被调用啦!");
        this.name = name;
    }

}

class Student extends Person
{
    private String name;
    public Student()
    {
            super("kudy");
            System.out.println("无参的Student()被调用啦~");
    }
    public Student(String name)
    {
            this();  //与super()不能同时出现
            System.out.println("有参的Student()被调用啦~");
    }

}

class Demo 
{
    public static void main(String[] args) 
    {
        new Student("abc");
    }
}


/*

输出的结构为:
--------------------------------
无参的Person()被调用啦!
有参的Person()被调用啦!
无参的Student()被调用啦~
有参的Student()被调用啦~
*/
/*
    关于多态:
                不变应万变
*/

abstract class Person
{
    public abstract void eat();
}

class Chinese extends Person
{
    public void eat()
    {
            System.out.println("中国的人还是广东人最好啦!");
    }
}
class Shop
{
    public void shopping(Person p )
    {
            System.out.println("咱们去买好东西吃!");
            p.eat();
    }
}
class Demo
{
    public static void main(String[] args) 
    {
        Shop shop = new Shop();
        shop.shopping(new Chinese());

    }
}
/*
    子类实例化的面试题!
    A1 B2 B1
*/

class A
{
    String name = "张三";
    public A()
    {
            System.out.println("A1");  //A1
    }
    public A(String name)
    {
        this();    
        System.out.println("A2");
    }
}

class B extends A
{
    String name = "王五";
    public B()
    { 
            this("张");  //如果有了this 就是默认没了super()
            System.out.println("B1");
    }
    public B(String name)
    {
    //    super();
        System.out.println("B2"); //B2
    }
}

class Demo 
{
    public static void main(String[] args) 
    {
        new B();
    }
}
/*
    覆盖父类的方法:
    子类当中覆盖父类的方法必须要和父类具有相同的方法名,具有相同的参数类型,具有相同的返回值 返回值类型一定要和
    子类的保持一直.这样就是方法的重写
    子类的方法的权限不能比父类有更严格的访问权限,因为我们经常要把子类当做父类来使用.
    子类去访问父类的方法时,会比较一下子类的访问权限.如果权限比父类小.那么就挂啦

    多态: 把子类当做父类来使用,针对父类进行方法的调用.传入不同的子类.执行的结构是一样的.
    除非父类被子类这个哥们重写啦方法~
*/
class Person
{
    public void run()
    {
            System.out.println("run() in Person");
    }
    public Person getInstance()
    {
            return new Person();
    }
}

class Student extends Person
{
    public void run()
    {
            System.out.println("happy");
            super.run(); //调用了父类的run方法!
    }
    public  Student getInstance() //权限不应该比父类的要小.  如果权限要比父类的小.那么就OH.Sorry
    {
        return new Student();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Student stu = new Student();
        stu.run();
        run(stu);
    }
    //实现了多态!
    public static void run(Person p )
    {
         p = p.getInstance();
        p.run(); //实现了多态
    }
}
/*
final 关键字:最终的!终态的
1.被fina修饰的属性为常量,是不能被更改的.也就是说:值是不能被改变
2.final所修饰的方法不能被重写,也就是说不能被子类所覆盖
3.final修饰所修饰的类是不能被继承的!

一般fina的用法:public static fina String NAME = "kudy"; 
为什么它一般是和static一起的呢?
解答:
既然一个属性都不能被修改啦.是一个常量啦.咱们可以把他定义一个static的.在类出生的时候.它也会跟着出生.
方便.
*/
/*
final class Person
{
    //被final所修饰的类是不能被继承的!
}
*/
class Person
{
    public static final int NUM = 19 ;//给我修饰的常量是不能被修改的!
    public final void show()
    {
            System.out.println("给我修饰的方法都是不能被重写!");
    }
}
class Student extends Person
{
    /*
    public void show()
    {
            System.out.println("真的是不能被重写噢!");
    }
    */
    public void run (int num)
    {
        //先比较后自加!
        System.out.println(++num);
        System.out.println(num++); 
        //? 为多少呢?  20  //因为第一次自加1  后来第二次的时候。先输出值它自己再加1
    }
}
class  Demo
{
    public static void main(String[] args) 
    {
        Student stu = new Student();
        stu.run(stu.NUM);
    }
}
/*
    设计模式!组合
    组合:当一个对象在运作的过程中必须要用到另外一个对象的时候,然而又不是构成继承的关系的!
*/
class Guo
{
    public void heat()
    {
            System.out.println("已经自动的加热啦~");
    }
}
class Chef
{
    //吃食品的时候一定要把它加热嘛~~
    Guo guo;
    Chef(Guo guo)
    {
        this.guo = guo;
    }
    public void cook()
    {
        guo.heat();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Chef chef = new Chef(new Guo());
        chef.cook();
    }
}
/*
    这样也是一个简单的组合!
*/
class Card
{
    public void spend()
    {
            System.out.println("一不小心就花了600RMB");
    }
}

class Person
{
    Card card ;
    public Person(Card card)
    {
        this.card = card;
    }
}

class Chinese extends Person
{
    public Chinese(Card card)
    {
        super(card);
    }
}

class Shop
{
    public void Shopping(Person p )
    {
        System.out.println("happy完毕!");
        p.card.spend();
    }
}

class  Demo
{
    public static void main(String[] args) 
    {
        Shop shop = new Shop();
        shop.Shopping(new Chinese(new Card()));
    }
}
/*
    抽象类:

1.没有方法体必须要声明为abstract抽象方法
2.含有抽象方法的类一定是抽象类
3.抽象类的定义:用abstract修饰的类叫做抽象类
4.抽象类是不能被实例化的(也就是说不能创建对象!);
5.可以用一个抽象类来继承一个抽象类.会继承所有的方法
6.如果用一个类来继承抽象类,那么必须要实现抽象类里面所有的方法
7.抽象类的访问权限没有什么特殊之处.主要是看修饰符!
8.抽象类里面不一定有抽象方法.但是包含有抽象方法一定是抽象类
*/

abstract class A
{
    abstract void a();//抽象方法!
    public void run()
    {
            System.out.println("A run()");
    }
}

abstract class B extends A
{
    abstract void b();
}

class C extends B
{
    //必须要把它所继承的所有的抽象方法实现!
    public void a()
    {
            System.out.println("A.class");
    }
    public void b()
    {
            System.out.println("B.class"); //实现B
    }
}
class  Demo
{
    public static void main(String[] args) 
    {
        A a = new C();
        if(a instanceof C)
        {
            C c = (C)a;
            c.a();
            c.b();
            c.run();
        }
    }
}
/*
    如果有多个类具有相同的方法声明,但是方法的实现细节不一样.
    我们就需要定义抽象类. 抽象父类

    里面可用到的新学习的知识  : 组合哦
*/

abstract class Person
{
    public abstract void eat();
    public void run()
    {
            System.out.println("吃完饭跑步是最好的!");
    }
}

class Man extends Person
{
    public void eat()
    {
            System.out.println("大口大口的吃!");
    }
}

class WoMan extends Person
{
    public void eat()
    {
            System.out.println("小口小口的吃!");
    }
}

class Begin
{
    private Person p;
    public  Begin(Person p)
    {
        this.p = p;
    }
    public void getBegin()
    {
        p.eat();
        p.run();
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Begin begin = new Begin(new Man());
        begin.getBegin();
    }
}
//甲写的代码

class C
{
    public void run(A a)
    {
        a.c();
    }
}
abstract class A
{
    abstract void a();
    abstract void b();
    abstract void c();  //我这里有一个C是被子类所重写啦!
    abstract void d();
    abstract void e();
    abstract void f();
}

abstract class AbstractB extends A  //需要我都可以实现!但是我用到这种方式!
{
    public void a()
    {

    }
    public void b()
    {

    }
    public void c() //哥们.你也有啊!是不是OH啦
    {

    }
    public void d()
    {

    }
    public void e()
    {

    }
    public void f()
    {

    }
}
class B extends A
{
    public void a()
    {

    }
    public void b()
    {

    }
    public void c() //哥们.你也有啊!是不是OH啦
    {
            System.out.println("c() in B");
    }
    public void d()
    {

    }
    public void e()
    {

    }
    public void f()
    {

    }
}

class  Demo
{
    public static void main(String[] args) 
    {
        /*
        C c = new C();
        c.run(new B());
        */
        C  c = new C();
        //为什么抽象的都可以new呢?但要注意.我这个是匿名内部类
        c.run(new AbstractB(){
            public void c()
            {
                    System.out.println(" AbstractB in C");
            }
        }
            );
    }
}
/*
    模板方法的设计模式:
    定义一个抽象类作为模板,将具体做事情方法定义出来,但是不实现
    2.对外提供一个共有的方法作为接口,规定做事情的顺序/这个方法应该为final 避免了让子类重写
    子类继承模板,实现所有的抽象方法()
*/

abstract class AbatractPrint
{
    abstract void opend();
    abstract void print();
    abstract void close();

    //定义成终态的.避免了子类所修改!
    public final void run()
    {
        this.opend();
        print();
        close();  //调用方法!
    }
}

class StringPrint extends AbatractPrint
{
    private String data;
    StringPrint(String data)
    {
        this.data = data;
    }
    public void opend()
    {
            System.out.print("<<");
    }
    public void print()
    {
            System.out.print(data);
    }
    public void close()
    {
            System.out.print(">>");
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        AbatractPrint abatractPrint = new StringPrint("kudy");
        abatractPrint.run();
        //使用匿名内部类做一下这道题目!
        //我现在不是为了抽象类创建对象.而是为了匿名子类!  //也多多态的一种形式!
        //匿名内部类重写了父类的方法!并且调用一把run();
        new AbatractPrint(){
                public void opend()
        {
                System.out.print("<<");
        }
        public void print()
        {
                System.out.print("show");
        }
        public void close()
        {
                System.out.print(">>");
        }
        }.run();
    }
}
//定义抽象类作为接口,实现个模块之间的解耦
/*
        首先第一种方法的:  显示就是三个人不能同时分工协作啦~~

        咱们传入的时候要注意:  我们传入的是子类.  父类型的引用指向了子类型的对象。
*/
//定义一个抽象的数据产生器!
import java.io.*;
abstract class Generator
{
    abstract String getData();
}

//定义一个抽象的数据处理器
abstract class  DataHandler
{
    abstract String    handleData(Generator generator);
}

//甲负责写数据产生器
class OneGenerator extends Generator
{
    public String getData()
    {
            return "hello";  //产生了一个数据!
    }
}

//乙所负责写的数据处理代码
class OneDataHandler extends DataHandler
{
    public String  handleData(Generator generator)
    {
        String data = generator.getData();
        return  "~~"+data+"~~"; 
    }
}

//数据产生器!
class TwoGenerator extends Generator
{
    public String getData()
    {
        return "小细加油";
    }
}

//数据处理器!
class TwoDataHandler extends DataHandler
{
    public String     handleData(Generator generator)
    {
        String data = generator.getData();
        return "~~~"+data+"~~~";
    }
}


/*
    数据显示!
*/
class Demo 
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader br 
                            = new BufferedReader(new InputStreamReader(System.in));
        /*
        DataHandler data = new OneDataHandler();
        Generator gen = new OneGenerator();
        */
        //通过读取键盘获得用户使用的数据产生器名字
        System.out.println("请输入您使用的数据产生器:");
        String generatorClassName = br.readLine();
        //根据类名反射出类
        //Class class -->new Class()对象 --》class.Class
        //1-1根据类名反射出类!
        Class generatorClazz = Class.forName(generatorClassName);  ////又因为返回的是object 类型/所以我们要强制转换.否则没有办法赋值。
        //根据类创建实例对象(数据产生器)
         Generator  generator=( Generator) generatorClazz.newInstance(); //类创建对象。并且是父类型的引用指向子类型的对象。

         //2.通过反射获得数据的处理器对象
         System.out.println("请输入您要使用的数据处理器:");
         String dataHandlerClassName = br.readLine();
         Class dataHandlerClazz = Class.forName(dataHandlerClassName);
         DataHandler dataHandler = (DataHandler)dataHandlerClazz.newInstance();
        String data = dataHandler.handleData(generator);
        System.out.println(data);
    }
}
posted @ 2012-08-07 00:59 、小细 阅读(66) | 评论 (0)编辑 收藏
/*
    内部类:
1.在类中定义的类我们称之为内部类,它是外部类的一个成员。
2.内部类可以直接访问外部类的成员,但是外部类不能直接的去调用外部类的成员、
其实内部类调用外部类的成员的时候.其实是使用到了:类名.this.变量名 来访问外部类的成员。
3.在内部类中的方法可以使用this引用调用这个方法的内部类对象.


*/
class Outer
{
    String name = "张三";
    public void run()
    {
        System.out.println("Outer is Running");
    }
    public void show()
    {
        System.out.println("My name is Outer");
        System.out.println(new Inner().age);
    }
    class Inner
    {
            int age = 19;
            public void run()
            {
                System.out.println("Inner is Running");
            }

            public void eat()
            {
                this.run();  //this.代表方法所调用的对象.它的对象是inner 所以输出的是inner
                show();  //因为创建内部类的时候.外部类的对象已经创建了.  如果虚拟机在内部类中找不到.它会到外部类去找这个show()对象.
                System.out.println(Outer.this.name); //其实同等于:Outer.this.name  //类名.name
                System.out.println("Nnner is Eat");
            }
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Outer.Inner  inner = new Outer().new Inner();  //类型要一致!
        inner.run();
        inner.eat();

    }
}

/*
    可以在方法中定义内部类?
    System.out.println(age);为什么会访问不了呢.编译出错/
    其实:当我们在外部类调用A对象的时候.run()方法由于age是存储在栈内存的临时变量中的. 当我们对象调用完毕过后呢.
    有可能是会被释放调的.而当你再次调用的时候 age 的时候呢.由于虚拟机可能会被释放.所以调用不了.
    那么:虚拟机认为你这样做是编译错误的!
*/

class A
{
    String name = "小细"    ;
    public void run()
    {    
        int age = 19;
        class B
        {
            public void run()
            {
                String name = "王五";
                System.out.println("my name is B");
                //System.out.println(age);
                System.out.println(A.this.name);  //通过类名.this.属性名访问外部类的属性.
            }
        }
        new B().run();
    }
}

class Demo 
{
    public static void main(String[] args) 
    {
        A a = new A();
        a.run();
    }
}

/*
    匿名内部类:

*/
class Fruit
{
    public void qupi()
    {

    }
}

class Person
{
    public void eat(Fruit f)
    {
        f.qupi();
        System.out.println("吃完啦!!");
    }
}

class Demo
{
    public static void main(String[] args) 
    {
        Person p = new Person();
        p.eat(new Fruit(){
            public void qupi()
            {
                System.out.println("Apple把皮弄开!");
            }
        }
            );
    }
}

/*
    static修饰的静态内部类:

    1.静态的内部类可以声明非静态的属性和方法.  但是静态的内部类是不能访问外部类非静态的方法.因为外部类的属性需要创建对象才能调用.
    你内部类是不需要创建对象的.所以调用不了。

    2.静态的内部类不能访问非静态的属性.
*/

class Outer
{
    static  String name = "kudy";
    String ID = "888";
    static class Inner
    {
            int age = 19;
            public void run()
            {
                    System.out.println(age);
                    System.out.println("Inner is happy");
                    System.out.println(Outer.name); //因为是不需要创建对象的.所以可以使用Outer.name访问外部的静态的方法。
                //    System.out.println(Outer.ID);
            }
    }
}

class Demo 
{
    public static void main(String[] args) 
    {
        Outer.Inner inner =  new  Outer.Inner();  //静态的内部类一定要静态的去创建!
        //System.out.println(inner.age);
        inner.run();

    }
}
/*
    类的继承
1.使用extends关键字来声明类的关系
2.子类会自动继承父类的属性与方法
*/

class Person
{
    String name ;
    public void run()
    {
        System.out.println("Person is Running");
    }
}

class Man extends Person
{
    public void toLike()
    {
        System.out.println(name +"运动"); //默认会添加上this的
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Man man = new Man();
        man.name = "小细";
        man.run();
        man.toLike();
    }
}
    

/*
    类的继承是为了实现代码的复用性,如果有多个类具有相同的方法.我们应该尽量把她抽出一个类来
*/
class Person
{
    String name ;
    int age;
    public void eat()
    {
        System.out.println(name+"吃饭"+",年龄为:"+age);  //this.name this.age
    }
    public void run()
    {
        System.out.println("需要运动");
    }
}

class Student extends Person
{
    public void eat()
    {
        System.out.println("吃一口饭");
        super.eat();  //调用父类的方法、。
        System.out.println("看一下作业");
    }
}
class Teacher extends Person
{
    public void eat()
    {
        System.out.println("抽一根");
        super.eat();
        System.out.println("再来一根");
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Student student = new Student();
        student.name = "小细";
        student.age = 19;
        student.eat();
        student.run();

    }
}
/*
父类型的引用指向子类型的对象.也就是想上类型转换.不需要强制转换
强制转换的要求:  父类型的引用指向子类型的对象。
3.把父类当做子类来使用是不行的,因为子类有的.父类型不一定有
4.当做子类当做父类来用时,只能使用父类型所拥有的方法。
如果调用子类拥有的方法.编译器会报错!所以需要强制转换.但在强制转换的前提下我们要知道父类型的引用是否是指向了子类型的对象
强制转换之前需要判断一下.
注意:
        1.当你父类型的引用指向子类型的对象的时候.你必须要清楚的就是:你访问的属性是会是父类的.而不是子类的.
        因为java在属性方法是做了静态的绑定.谁是我的类型.我就去谁的类型去找.而方法就刚好相反.
        方法就是:谁指向谁.我就调用谁的方法.。  因为是做了动态的绑定。
*/

class Typist
{
    String name = "小细";
    public void type()
    {
        System.out.println("typeing");
    }
}

class Coder extends Typist
{
    String name = "王五";
    public void type()
    {
        System.out.println("tepeing slowly!!!");
    }
    public void code()
    {
        System.out.println("Codeing");
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        //向上类型转换: 父类型的引用指向子类型的对象.
        Typist typist = new Coder();
        //typist.type();  因为你是指向了子类型的引用.所以java做了动态绑定.也就是说你绑定了一个子类型的方法。
        System.out.println(typist.name); 
        /*
            为什么输出小细呢.因为java在检查的时候.属性是不做动态绑定的.也就是说.类型是谁.他就会找类型里面的属性.
        */
        /*
            Code code = new Typist();
            子类型的引用不能指向父类的对象.因为子类有的.父类型不一定有.
        */
        Coder coder;
        if(typist instanceof Coder)  //父类型的引用指向子类型的对象才可以抢走转换!
        {
             coder = (Coder)typist; //强制转换成子类
             System.out.println(coder.name);
        }
    
        

    }
}

/*
    因为java的属性在父类型的引用指向子类型的情况是做了静态的绑定的.所以我们可以这么做!
*/

class Person
{
    private String name = "无名氏";

    public String getName()
    {
        return name;
    }
    public void eat()
    {
        System.out.println("eating");
    }
}
class A extends Person
{
        private String name = "小细";
        public String getName()
        {
            return name;
        }
}
class B extends Person
{
        String name = "kudy";
}
class Demo
{
    public static void main(String[] args) 
    {
        Person p = new A();
        /*
            因为java的父类型的引用指向子类型的对象的时候.方法使用了动态.而属性只使用了静态.也就是说:类型是那个.属性就是从
            那里去找
        */
        System.out.println(p.getName());//这样就是调用了子类型的属性啦~~
    }
}

/*
    什么情况下使用子类当做父类来使用
    匿名内部类:new一个父类对象,后面跟一个花括号,这时不需要创建父类的实例

*/

class Person
{
 String name = "无名氏";
    public void eat()
    {
        //每个人的爱好不同!
    }
}
class    Restaurant
{
    public void run(Person p)
    {
        p.eat();
    }
}


class Chinese extends Person
{

    public void eat()
    {
        String name = "中国人";  //在方法里面是动态调用的哦。
        System.out.println(name+"我是拿筷子吃的!");
    }
}

class American extends Person
{

    public void eat()
    {
        String name = "美国人";
        System.out.println(name+"我只吃汉堡包!");
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
        Restaurant r = new Restaurant();
        //r.run(new American());
        r.run(new Chinese());

/*
内部类:
        class JB extends Person
        {
            public void eat()
            {
                System.out.println("我是吃垃圾的!");
            }
        }
        r.run(new JB());
*/
    r.run(getIndia());
    }
    static  Person getIndia()
    {
        String name = "印度菜";
        Person p  = new Person(){  //我创建了一个子类.子类里面有eat方法重写啦.之后呢.再把这个重写好的对象返回来.也就是说:父类型的引用指向子类型的对象
        public void eat()
            {
                System.out.println(this.name+"印度菜");
            }
        };
        return p;
    }
}

class A
{
    String name = "小三";
    public String getName()
    {
        return name;
    }
    public void run()
    {
        System.out.println(name);
    }
}

class B extends A
{
    private String name = "小四";
    public String getName()
    {
        return name;
    }
    public void run()
    {
        System.out.println(name);
    }
    public void show()
    {
        System.out.println("我是子类!");
    }
}

class Demo 
{
    public static void main(String[] args) 
    {
        A a = new B();  //父类型的引用指向子类型的对象. 就可以使用子类型与父类型所共同拥有的方法.但是子类出来的就不行。
    //    a.show();
    /*
    System.out.println(a.name);

    如果这样写出来是小三,而不是小四,但是在方法里面输出来的就是小四.因为她的属性在方法里面运行啦.所以是动态的.
    而你单独如果想输出它的属性的话,它是根据了静态绑定来进行操作.也就是输出了类型里面属性的内容!

    那方法就是: 给所有的变量私有化.给他开一个public方法.返回属性!!因为方法是可以转换为动态的.

    有的人可能会问?不相同可以吗? 如果不相同的话.前面已经说过: 就是子类型所特有的.你父类型是不可以调用.除非需要强制转换!
    */
    String name = a.getName(); //这时候方法已经给重写
    System.out.println(name); //输出的会是小四
    }
}

/*
    对象的比较:
        对象的比较不能使用 == 这样比较的是比较地址.  应该用equals方法

        因为所有的类都是默认的继承与Object!  我们可以重写它里面的equals比较方法。
*/

class Person
{
    private String name ;
    private int age ;
    public Person(String name ,int age)
    {
        this.name = name ;
        this.age = age ;
    }
    
    @Override  //告诉编译器我重写父类型的方法!  大写的O
    //重写父类的方法!
    public boolean equals(Object obj)
    {
        if(this == obj)
            return true;
        if(obj instanceof  Person)      //如果你父类型的引用是指向了子类型的对象的.那么就判断.
        {
            //因为是按照了父类型的引用是指向了子类型的对象.首先我们要判断一下.强制类型转换.要不然我们是调用不了子类型的内容
            Person p =(Person)obj;

            if(this.name.equals(p.name)&&this.age == age)
                return true;
        }
        return false;
    }
}
class Demo 
{
    public static void main(String[] args) 
    {
    
        Person p1 = new Person("张三",19);  //p1就是当前对象!
        Person p2 = new Person("张三",19);
        System.out.println(p1.equals(p2));
        


    }
}
class Person
{
    String name ;
    public void eat()
    {
    }
}

class Restaurant
{
    public void show(Person p)
    {
        p.eat();
    }
}
class Chinese extends Person
{
    String name = "中国人";
    public void eat()
    {
        System.out.println(name+"我吃中国菜!");
    }
}

class Test 
{
    public static void main(String[] args) 
    {
        Restaurant r = new Restaurant();
        r.show(new Chinese());

        /*
            匿名内部类的第一种用法!
        */
        r.show(new Person(){
            public void eat()
            {
                System.out.println("日本人吃日本菜!");
            }
        }
        );
        r.show(getUSA());
    }

    public static Person getUSA()
    {
        Person p = new Person(){
            public void eat()
            {
                String name  = "美国人";
                System.out.println(name+"吃美国菜!");
            }
        };
        return p;
    }
}


使用Java的文档注释

文档注释以“/**”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要! 类的说明应在类定义之前,方法的说明应在方法的定义之前。

批注参数来标记一些特殊的属性及其相应的说明 。
@author<作者姓名>
@version<版本信息>
@param<参数名称><参数说明>
@return<返回值说明>

生成文档的命令
javadoc -d Engineer -version -author Engineer.java


心得:
我要向前冲,想前冲。

posted @ 2012-08-07 00:56 、小细 阅读(64) | 评论 (0)编辑 收藏

一.构造函数的定义与作用

1.函数的名次与类同名
2.没有返回值类型
3.不能使用retrun 关键字来返回一个值

注意》》:没有返回值类型声明不等同于“void”,void也是一种返回值的声明(如果写上了void,那就是一个普通的方法啦!)

二.构造函数的具体应用

构造函数可以被重载

1.构造函数也一般的函数一样,都是可以被重载的.但是参数类型要不一致.而且构造函数是没有返回值

构造函数如果被调用?

2.使用new关键字来创建对象的时候,会自动的调用一个类的构造函数.也可以在一个类中利用this();来调用其他的构造函数!
但是要注意:递归构造器调用. 普通函数的调用是:this.run(); 而构造函数调用是this();这样来调用.

类必须要定义构造函数

3.其实每一个类中至少都有一个构造函数的,如果定义类时,没有显示的声明任何的构造函数.系统会自动的为这个类创建了一个不带任何参数的构造函数.
如果你在一个类中创建了一个显式的构造函数.那么,虚拟机就不会自动的为你创建

构造函数的访问权限

4.一般在定义构造函数的时,如果没有特殊的需求(就好单例)应该使用public关键字来修饰构造函数
在一些特殊的情况使用private关键字

new Person()虚拟机做了什么事?

1.首先把类加载进来
2.为这个类创建对象.并且为成员变量初始化
3.自动的调用构造函数里面的内容


三:this关键字

this的引用

1.this关键字一般用于方法内
2.this代表是一个对象的引用
具体引用那个对象,就看这个调用方法的对象

this的应用场景

1.当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用 ,此时this是指当前对象自己。

2.当你要把自己作为参数传递给别的对象时,也可以用this关键字,此时this被作为参数传递。

在内部类中也会经常使用this关键字,此时this代表内部类对象,如想引用外部类对象,this前面还需要加上外部类的类名。
在构造函数中,可以使用this(实参)来调用该类的其他构造函数,此时,应注意,调用代码只能在第一行,在别的方法中不能这样调构造函数,在一个构造函数中只能调一个构造函数(因为都必须放在前面啦.所以只能调用一个)


四.函数的参数传递

1.基本数据类型在参数传递过程中值是不会改变的
(int ,byte,char,long,short,double,float,boolean )

2.引用数据类型在参数传递的过程中,其值是会被改变的.

五:static关键字之静态变量

static关键字:在程序中使用static关键字来修饰一个成员

类什么时候加载?
类只会加载一次,又因为static修饰的变量是随着类的加载而加载的. 所以其值是被任何的对象所共享.

1.静态变量修饰的属性是被所有类的实例所共享

2.静态变量可以通过类名.属性名直接访问.(因为它是随着类的加载而加载.只能加载一次)

3.静态变量在类的加载时就完成了初始化.


第六:Static关键字之静态方法

1.用static修饰的方法是静态方法

2.在类加载后,就可以直接通过类名来调用静态方法

3.可以使用类名.方法名来直接访问

4.静态方法的内部是不能直接的访问非静态的成员
原因:
因为静态访问在类加载后就可以直接调用了,而非静态的成员则需要创建对象才可以调用.所以是不能直接的来访问非静态的成员

5.静态方法内部,只能通过创建该类的对象才可以访问非static的方法.静态方法中是不能使用this关键字,因为静态方法没有别的引用. 静态方法中也没有所谓的对象。

6.静态的方法的应用:

1. 一般在工具类上面.因为工具类是可以直接调用调用就可以使用了嘛.
2.生产对象中也可以使用。

posted @ 2012-08-07 00:54 、小细 阅读(70) | 评论 (0)编辑 收藏

面向对象:一种编程思想,使用对象来描述生活中的事物:
面向对象的四大特征: 1.封装 2.继承 3.多态 4.抽象
1.类和对象:
类是对象的抽象,对象是类的实例

2.this关键字是一个对象的引用,thiis在方法内,谁调用我.我就为谁服务

3.创建对象:

Person p ;
p = new Person();
1.在栈内存中定义一个变量p ,类型是:person
2.在堆内存中,首先加载一个Person.class字节码
3.在堆内存中创建一个对象 new Person ()的一个实例
4.自动初始化堆内存里面的数据
5.把所创建的首地址变量赋值给p引用

4.对象的生命周期:
当对象被创建到失去所有的引用(没有任何一个变量记住它的首地址,)这期间我们称之为对象的生命
周期,当对象的生命周期结束后!就会变成垃圾对象,等待java的虚拟机回收!

5.匿名对象
1.匿名对象只使用一次就会被java的垃圾回收机制自动回收,用途:如果对一个对象只进行一次的调用,那么就可以使用匿名对象

2.咱们一般是在匿名对象作为实参传送给一个函数。


2.类的封装:

概念:将一系列特征相似的对象共同的属性和行为抽象出来用一个类来描述.

类的成员变量描述的是属性,类的成员方法描述的是对象的行为
为了实现良好的封装性,需要将类的成员变量私有化(private),对外提供了set 与get方法
但是boolean 的最好使用 is

属性私有化:
1.更加符合现实的逻辑
2.更加正确地控制别人的属性访问权限
3.防止一些错误的操作!
方法有时候也需要封装.

3.构造函数:

1.函数的名称一定要和类名相同
2.没有返回值声明
3.不能在语句中使用return 语句返回一个值!
构造函数的作用:
当我们使用new关键字来创建第一个对象的时,java的虚拟机就会自动的会调用构造函数.
我们可以为构造函数中做一些初始化的信息!
但要注意的问题:这个初始化的name 与age 并不是代表了:this的


构造方法的具体应用;

1.构造方法是可以被重载的(参数类型不一致就可以)
2.构造函数也可以添加访问权限!不过一般建议使用public关键字来修饰.

个人心得总结:
      今天的学习算是比较满意吧!但是有一点注意的: 还是有一点点分心!
      第二:认真听课。
      要多听课!个人在感觉这块了解不够深入.

posted @ 2012-08-07 00:52 、小细 阅读(59) | 评论 (0)编辑 收藏



一、判断题
1、Java语言是不区分大小写的。 错,Java语言是严格区分大小写的
2、Java程序源文件的扩展名为“.jar”。 错,Java程序源文件的扩展名为”.java” 
3、Java程序一般应含有main方法,因为它是所有java程序的入口。正确
4、声明main方法时,其声明可以写成:
Public static void main(String args[])
也可以写成:
Public static void main(String s[])   
 不正确,P不应该大写,应该小写,其他地方是正确的
6、假设有一个名为Hello的java源程序,那么编译这个文件的命令为javac Hello.java。
  正确
7、当运行java程序时,类加载器将字节码加载到内存中,字节码检验器确认所有的字节码是合法的并且不会破坏java的安全限制,然后解释器读取这些字节码并将它们翻译成计算机能够执行的语言。
正确
8、在java语言中,每个ASCII码英文字符占用8个二进制位,而每个中文汉字字符占用16个二进制位。FALSE
正确 英文字符占1个字节8位,中文字符占2个字节16位
9、short s = 64000语句是否正确。
不正确,超出short的取值范围和应该在64000后面加上分号“;”

二、填空题    
1、Sun公司提供了三种java开发工具:其用于工作站和个人计算机的标准开发工具为_
java se _____,用于企业级开发的工具为_java ee______,用于智能移动产品的工具为__ java me______。

2、Java程序中的数据类型分为哪两种_基本数据类型和引用数据类型__________________________。
8种基本数据类型 数值型(byte short int long float double)字符型 char  
布尔型 (Boolean) true 和false
引用数据类型 类,接口,数组
3、配置java开发和运行环境,通常需要配置哪两个环境变量___path_______和________classpath____。

4、在java源文件中,可以有哪几种类型的注释_____单行注释 多行注释和文档注释___________________________。

5、查看当前java虚似机版本的java命令为___java -version________。

6、设一个java源文件的名字为Test.java,则编译该文件的命令为_javac Test.java_____,运行的命令为___java Test___。

7、Java虚似机运行java程序过程为:首先从后缀为_.class____的文件加载代码到内存中,然后在内存中__字节码检验器检查______代码的合法性和安全性,然后___解释器____执行合法和安全的代码。

8、Java语言在____1995______年由____SUN______公司第一次正式发布的,__
詹姆斯•戈斯林(James Gosling)________被誉为java之父。

9、设Hello.java文件的内容如下:
class Hello
{
    static void main(String args[])
    {
        System.out.println(“Hello World!”);
    }
}
下面说法正确的是:D
A、    无法通过编译,因为main方法声明不对。
B、    可以编译,但不可以运行。
C、    可以编译,并可以输出正常结果。
D、    可以编译,但不可以运行,因为文件中没有public类。
  
10、请写出下面程序的运行结果____12_______:
public class Test
{
    public static void main(String args[])
    {
        int i = 0;
        while(true)
        {
            if(i++>10)
            {
                break;
            }
        }
        System.out.printnln(i);
    }
}
X++和++X的区别: X++是X先参与运算再自增,++X是先自增再参与运算
11、请写出下面程序的运行结果____11_______:
public class Test
{
    public static void main(String args[])
    {
        int i = 0;
        while(true)
        {
            if(++i>10)
            {
                break;
            }
        }
        System.out.printnln(i);
    }
}
12、请写出下面程序的运行结果________4________
class Test
{
    public static void main(String args[])
    {
        int a=1,b=2;
        if((a==0)&(++b==6))
            a = 100;
        System.out.println(a+b);
    }
}
(a==0)这个条件为false  (++b==6)这个条件首先b自增1后再参与比较,b变成了3,但这个条件也不成立,所以”a=100;”这个语句没有执行,最后(a+b)的值为(1+3)=4
13、请写出下面程序的运行结果_____4______________。
class Test
{
    public static int method(int x)
    {
        int j = 1;
        switch(x)
        {
            case 1:
                j++;
            case 2:
                j++;
            case 3:
                j++;
            case 4:
                j++;
            case 5:
                j++;
            default:
                j++;
        }
        return j;
    }
    public static void main(String args[])
    {
        System.out.println(method(4));
    }
}

14、请写出下面程序的运行结果_______7____________。
class Test
{
    public static void main(String args[])
    {
        int a = 2;
        switch(a)
        {
            case 1:
                a +=1;
                break;
            case 2:
                a +=2;
            case 3:
                a +=3;
                break;
            case 4:
                a +=4;
                break;
            default:
                a = 0;
        }
        System.out.println(a);
        
    }
}

三、简答题:
1、请判断下面的程序是否能正常编译并运行,如能编译请写出运行结果,如不能请改正。
    int i = 0;
    do
        System.out.println(i++);
    while(i<5);

  正确 :结果为 0
                1
                2
3
4
2、请指出下面程序可能出现的问题。
    class Test
    {
        public static void main(String args[])
        {
            int i = 0;
            do
{
    System.out.println(i++);
}
        }
    }
没有while 语句,do语句没有中止,不是正确的写法
3、请总结break、continue和return的具体用法,并写出相应的示例程序。
break于中止当前循环中的子语句
continue 语句只能出现在循环语句中,用于跳出循环的剩余语句块,接着执行下一次循环
for(int i=0;i<10;i++)
 {
          if(i%2==0)
        {
               continue; 
        }
      System.out.println(i);
 }
return 用于结束当前执行的语句,并返回一个值
static int getMax(int num1,int num2,int num3)
    {      
         
        int max=num1>num2?num1:num2;
            max=max>num3?max:num3;
        return max ;
    }

四、程序题:
1、    请编写程序,计算1+3+5+……………………+1999的结果。
源程序://FindSum.java
    public class FindSum
{
    public static void main(String args[])
    {
        int n = 1999 ;
        int sum = findSum(n);
        System.out.println("从0到"+n+"之间的奇数和为:");
        System.out.println("sum="+sum);
    }
    
    static int findSum(int n)
    {
        int sum=0;
        for(int i=0; i<=n; i++)
        {
            if(i%2==1)
                sum+=i;    
        }
        return sum;
    }
}
运行结果:
 
2、    请定义一个整数数组,用一种排序算法对这个数组进行排序。
 源代码://Demo42.java
public class Demo42
{
    public static void main(String args[])
    {
        int [] num = {12,45,10,23,5,123,89,411,9,78};
        
        System.out.println("排序前:");
        arrList(num);
        
        selectSort(num);
        System.out.println("排序后:");        
        arrList(num);
        
    }
    static void selectSort(int [] arr)
    {
        for(int i=0; i<arr.length-1; i++)
        {
            int pos = i;
            int max = arr[i];
            for(int j=i+1; j<arr.length;j++)
            {
                if(arr[j]>max)
                {
                    max = arr[j];
                    pos = j;
                }
            }
            exchange(arr,i,pos);
        }
            
    }
    static void exchange(int [] arr,int pos1,int pos2)
    {
        int temp;
        temp = arr[pos1];
        arr[pos1] = arr[pos2];
        arr[pos2] = temp;
    }
    static void arrList(int [] arr)
    {
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<arr.length; i++)
            sb.append(arr[i] + ",");
        sb.delete(sb.length()-1,sb.length());
        System.out.println(sb);
            
    }
}
运行结果:
 


3、    请用System.arraycopy实现数组的拷贝。
源代码://Demo43.java
public class Demo43
{
    public static void main(String args[])
    {
        int [] num1 = {15,89,16,56,10,2,5,123,84,99,753,612};
        int [] num2 = {789,145,100,20,36,95,88,71,40,126,91,65};
        System.out.println("数组拷贝前:");
        arrList(num1);
        arrList(num2);
        
        System.arraycopy(num1,3,num2,3,6);
        System.out.println("数组拷贝后:");
        arrList(num1);
        arrList(num2);        
    }
    
    static void arrList(int [] num)
    {
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<num.length; i++)
        {
            sb.append(num[i]+",");
        }
        sb.delete(sb.length()-1,sb.length());
        System.out.println(sb);
    }
}
运行结果:
 

4、    编写一个程序,程序里定义三个数,并输出这三个数的最大数。
源代码://Demo44.java
class Demo
{
    public static void main(String args [])
    {
        int num1 = Integer.parseInt(args[0]);
        int num2 = Integer.parseInt(args[1]);
        int num3 = Integer.parseInt(args[2]);
        System.out.println("这三个数的最大值是:");
        System.out.println(getMax(num1,num2,num3));
    }
    static int getMax(int num1,int num2,int num3)
    {      
         
        int max=num1>num2?num1:num2;
            max=max>num3?max:num3;
        return max ;
    }
}

运行结果:
 
5、    编写一个程序,这个程序把一个整数数组中的每个元素用逗号连接成一个字符串,例如,根据内容为[1][2][3]的数组形成内容为“1,2,3”的字符串。 
源代码://Demo45.java
  class arrDemo
{
    public static void main(String args [] )
    {
        int [] arr = {12,89,45,61,568,945,102,302,44,777,945,689};
        System.out.println("依次输出数组中的元素:");
        arrList(arr);
    }
    static void arrList(int [] arr)
    {
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<arr.length; i++)
            sb.append(arr[i]+",");
        sb.delete(sb.length()-1,sb.length());
        System.out.println(sb);
    }
    
}
运行结果:
 
6、    编写一个程序,从键盘上接受用户输入的需要转的数,得到的一定是字符串,将此字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。
源代码://Demo46.java
class appDemo
{
    public static void main (String args [])
    {
        int num = Integer.parseInt(args[0]);
        System.out.println("输入的整数为:"+num);
        System.out.println("这个十进制的整数对应的二进制形式为:");
        ten2Binary(num);
    }
    static void ten2Binary(int num)
    {
        StringBuffer sb = new StringBuffer();
        while(num>0)
        {
            int temp = num%2;
            num=num/2;
            sb.append(temp);            
        }
        sb.reverse();
        System.out.println(sb);            
    }
}
运行结果:
 

7、     请用移位的方式打印出一个十进制整数的十六进制形式。提示:按每4个二进制位对整数进行移位和去高位处理,得到的结果就是十六进制数的一位,然后按下面三种方式之一(作为作业,要求每种方式都用到)计算出一个十六进制数值对应的十六进制形式: 
1)0-9之间的数值直接加上字符'0',9以上的数值减去10以后再加上字符'A' 
2)定义一个数组,其中包含0-F这些字符,然后用要计算的数值作为数组的索引号,即可获得其对应的十六进制数据。 
3)Character.forDigit静态方法可以将一个十六进制的数字转变成其对应的字符表示形式,例如,根据数值15返回字符'F'。 
源代码://Demo47.java
class hDemo
{
    public static void main(String args[])
    {
        int num = Integer.parseInt(args[0]);
        System.out.println("输入的整数为:"+num);
        System.out.println("这个十进制整数对应的十六进制形式是:");
        ten2Hex(num);
    }
    static void ten2Hex(int num)
    {
        StringBuffer sb = new StringBuffer();
        char[] buf = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        for(int i=0; i<8; i++)
        {
            int temp = num&0x000000000f;
            sb.append(buf[temp]);
            num=num>>4;
        }
        sb.reverse();
        System.out.println(sb);        
        
    }
}
运行结果:
 
posted @ 2012-08-07 00:50 、小细 阅读(87) | 评论 (0)编辑 收藏

一:java的基本语法

       1.代码都是存放在class里面的

       2.严格区分大小写(num NUM)是两个不同的变量

       3.格式自由.

       4.单行注释与多行注释的和文档注释

       5.标识符:

       全部使用英文字母,骆驼式命名:从第二个单词开始,每个单词的首字母都要大写,其它的小写

(标识符不能为关键字,不能以数字开头)

 

二:java中的变量

    1.有八个原声数据类型和引用数据类型.

    2.类型转换:

      byte、short、char类型在运行过程中都会提升为int 类型(这样的方式叫自动类型)我们可以将一个int类型强制转换成byte、short、char类型 (需要强制类型转换!显示类型转换丢失精度.

      System.out.println('a'+1); 因为 1是int类型的,所以会升级为int 类型.

      System.out.println(""+'a'+1);(任何数字和字符串相并且都自动转换成字符串).

    3.变量的生命周期:

      在方法内定义的变量,当方法被调用的时候,变量被定义,当方法接收的时候。变量也会随着方法释放掉变量的作用域内是不可以重复定义,超出变量的作用域,变量将不能访问.

 

三:java中的函数

    1.定义:函数,又称为方法,能够完成某特定代码的代码块,其个名字,方便于方法的调用函数的作用: 就是可以重复的去利用某一段代码

    2.函数必须有的: 函数名 返回值  返回值类型  (形式参数看需求而定)

    3.形参:方法定义的形参相当于在方法中定义了一个局部变量,当这个方法被调用的时候,也就是对其方法里面的参数初始化啦!初始值为传递进来的参数

    4.返回值类型:可以为任意一个类型,有一种特殊:当方法没有返回值的时候,我们要把返回值类型定义为(void)

    5.return :在方法中可以使用return 返回一个值,(返回的值必须是与返回值类型一致)

    6.方法的重载:

              多个函数具有相同的名字,参数的个数或者类型不同都可以.  返回值类型不能做衡量方法的重载

 

四:java中的运算符

 

1.算术运算符   % 取模,也叫做取余

  ++自增1,--自减1

  ++x 与x++的区别: 本质上是没有区别的,x++是先参与运算再自加  ,而++x先自加一次才参与运算

  在取模运算中,模数的符号会被忽略,被模数符号不能被忽略

2.赋值运算符 = 是赋值的意思

  += ,-=,*=,\=,%=

3.比较运算符号: == 是相互比较的意思

    instanceof:判断该对象是否是属于指定的类型

4.逻辑运算符

    &和&&的区别:

      1. &&如果左边为假,结果注定为假,右边不参与运算

                 2.&如果左边为假,结构注定为假,但是右边会参与运算

    |和||的区别:

      1.如果左边为真,结果注定为真,右边不参与运算

                 2.如果左边为真,结果注定为真,右边参与运算

 

5.位运算符

    &(与):真真得真,真假得假,假假得假

    |(或):真假为真,真真为真,假假为假

    ^(异或):任何一个数与一个指定的数异或两次,其结果等于本身,(第一个数异或第二个数 其结果再异或第二个.其结果等于它本身)(不同为1,相同为0)

    移位运算符:

      <<左移,砍掉高位,低位补0 一定要把它更改成32位。(左移N位相当于乘以2的N次方)

                >>右移,砍掉低位,高位要看最高位的符号。符号位为1,就补1,符号位为0就补0(右移N位,相当于除以2的N次方)

6.switch

switch中的参数是必须是int类型的,但是byte,short,char都是隐式的自动类型提升啦~

break :结束循环

continue:提前结束本次循环,进入到下一次循环

 

 

总结:后期学习不认真!估计时间不安排好!!。。注意。

 

 

  1 小算法复习:
  2 /*
  3     不用第三方变量交换两个数的值
  4 
  5     异或:第一个数异或第二个数,之后再把结果异或第二个数。其结果等于它本身!
  6 
  7     1.<<最高位砍掉,最低位补零
  8     (左移多少位,其实就是*2的N次方)
  9     2.>>最低位砍掉.如果最高位是1,前面就是补1,否则补0
 10     //(又移多少位,就是/2的N次方)
 11 */
 12 
 13 class Demo 
 14 {
 15     public static void main(String[] args) 
 16     {
 17         int a = 3;
 18         int b = 5;
 19 
 20         a = a ^ b;
 21         b = a ^ b;
 22         a = a ^ b ;
 23         System.out.println("a == "+a);
 24         System.out.println("b =="+b);
 25 
 26     }
 27 }
 28 /*某个培训中心要为新到的学员安排房间,假设共有x个学员,
 29 每个房间可以住6人,让你用一个公式来计算他们要住的房间数
 30 */
 31 
 32 
 33 class  Demo
 34 {
 35     public static void main(String[] args) 
 36     {
 37         int num = 48;
 38         int homeNuber = getHomeNumber(num);
 39         System.out.println("学生的个数为:"+homeNuber);
 40     }
 41     static int getHomeNumber(int num)  //形式参数的初始化其实就是传递进来的参数帮他初始化啦~
 42     {
 43         return (num+5)/6;  //给一个最大的限度!
 44     }
 45 }
 46 
 47 /*
 48     利用无限循环实现0 - 9 之间的数之间的重复循环
 49 */
 50 
 51 class Demo 
 52 {
 53     public static void main(String[] args) 
 54     {
 55         int x = 0;
 56         while(true)
 57         {
 58 
 59             x = (x+1)%10;
 60             System.out.println(x);
 61         }
 62     }
 63 }
 64 
 65 /*
 66     利用小技巧把10进制转换成2进制代码!
 67 */
 68 import java.io.*;
 69 class Demo 
 70 {
 71     public static void main(String[] args) throws Exception
 72     {
 73         //读取键盘
 74         BufferedReader br = 
 75                 new BufferedReader(new InputStreamReader(System.in));
 76         System.out.println("本程序可以帮助您把十进制代码转换成二进制代码:");
 77         String line = br.readLine();
 78         int num = Integer.parseInt(line);
 79         StringBuffer sb = new StringBuffer();
 80         while(num>0)
 81         {
 82             int temp = num % 2; //获取到除以2的余数!
 83             sb.append(temp);
 84             num = num / 2; 
 85         }
 86             sb.reverse();
 87             System.out.println(sb);
 88     }
 89 }
 90 
 91 
 92 /*
 93     十进制转换成十六进制之方法一。
 94 */
 95 import java.io.*;
 96 class  Demo5
 97 {
 98     public static void main(String[] args) throws Exception
 99     {
100         BufferedReader br = 
101                             new BufferedReader(new InputStreamReader(System.in));
102 
103         System.out.println("本程序可以通过十进制转换成十六进制:");
104         
105         String line = br.readLine();
106         int num = Integer.parseInt(line);
107 
108         StringBuffer sb = new StringBuffer();
109         while(num>0)
110         {
111             int temp = num % 16;
112             if(temp>9)
113             {
114                 sb.append((char)(temp-10+'A'));
115             }else
116             {
117                 sb.append(temp);
118             }
119             num = num / 16;
120         }
121         sb.reverse();
122         System.out.println(sb);
123     }
124 }
125 
126 
127 /*
128 用移位的方法来求一个数
129 
130 十进制转换成十六进制
131 */
132 import java.io.*;
133 class Demo 
134 {
135     public static void main(String[] args) throws Exception
136     {
137         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
138         System.out.println("本程序可以帮助您从十进制转换到十六进制:");
139         String line = br.readLine();
140         int num = Integer.parseInt(line);
141         Ten2Hex(num);
142     }
143 
144     static void Ten2Hex(int num)
145     {
146         StringBuffer sb = new StringBuffer();
147         int count = 0x00000000f;
148         for(int i = 0;i<8;i++)
149         {
150             int temp = num & count;  
151             if(temp>9)
152             {
153                 sb.append((char)((temp-10)+'A'));  //类型要注意
154             }
155             else
156             {
157                 sb.append(temp);
158             }
159             num = num >>4;
160             
161         }
162         sb.reverse();
163         System.out.println("结果为:"+sb);
164     }
165 }
166 
167 /*
168     打印金字塔程序!
169     求算法的时候要注意:
170     找到求第一个的规律.
171     然后循环就可以。
172 */
173 
174 
175 class Demo 
176 {
177     public static void main(String[] args) 
178     {
179         int n = 4;
180         for(int i = 0;i<n;i++)
181         {
182             for(int j = 0;j<n-i;j++)
183             {
184                     System.out.print(" ");
185             }
186             for(int k =0;k<i*2-1;k++)
187             {
188                     System.out.print("*");
189             }
190             System.out.println();
191         }
192     }
193 }
194 
195 
196 总结:
197     其实switch的参数必须是int类型的,为什么byte char short参数可以传递进来呢?
198 因为它的类型自动提升为int类型啦。也就是隐式的进行了强制转换/所以是可以的.
posted @ 2012-08-07 00:40 、小细 阅读(56) | 评论 (0)编辑 收藏

一.java是一门高级的语言,具有跨平台(一处编译,到处运行)

1.javac 编译源文件.java

2.运行源文件 java 启动虚拟机

3.cls 清空dos界面文字!

4.java源文件 -->java.class(字节码) -->windows(jvm)  -->linux(jvm)

二:path环境变量

1.什么是path环境变量 ?path环境变量的作用?

解答:当我们运行一个exe可执行的文件的时候,系统会首先在当前的目录下去寻找,寻找不到的时候就会在注册表中寻找.如果没有了最后才到path环境变量中寻找.

所以当我们想成功的在任何的目录下运行javac 与java命令的时候,我们一定要把环境变量设置在path中.

2.查看path环境变量的两种方式

解答:

第一种:我们可以通过在dos窗口里面输入 set path命令查看path环境变量.

第二种:我们可以系统中查看到path环境变量的设置(图形窗口里面)。

3.如何设置path环境变量

解答:

新建: JAVA_HOME: D:\java\jdk\(这部分内容是经常要修改的)

在path环境下面:%JAVA_HOME%bin;

4.%path% 的意义?

解答: 表示对path里面的做引用

java -version 表示查看当前的java版本好

class Path的作用:

类加载时,java虚拟机会在classpath指定的目录下找相对应的class文件

在编译时可以使用绝对路径名,运行时则不能.

三.进制的转换

1b = 8bit

1kb = 2^10b  = 1024b

1mb = 102kb

1g = 1024mb

1t = 1024g

十进制转换成二进制:

八进制转换成二进制:

十六进制转换成二进制:

将需要转换的数字除以2,获取到商和余数.将商继续除以2,取到商为零.最后将所有的余数倒序排列.得到的就是该转换出来的结果!

八进制转换成二进制:

十进制转换成二进制:除以2,直到商为零。将余数反转

小数除以大数,则商为零。余数是小数本身

二进制转换成十进制呢?

101 

解题:

1*2^0 + 0*2^1+1*2^2 = 6;

2^0(相当于)没有!

二进制转换成八进制:每三个为一个整体  二进制转换成十六进制的每4个位一个整体/

八进制转换成十进制:

24

解题:

4*8^0+2*8^1 = 4+16 = 20 

计算机的运行原理:  都是累加器的

5 - 5 其实在计算机中运行效果是: 5+(-5)

负数是如何表示的? 

原码 取反 反码 加1  补码

总结:

如何将二进制,八进制  ,十六进制转换成十进制呢?

12F 转换成十进制:

15*16^0+2*16^1+1*16^2 = 15+ 32 + 256 = 303 其实就是12f

都是采用乘法。

如果将十进制转换成二进制,十六进制  八进制呢?

都是采用除法,取余.

关于原码,反码与补码:

-5 原码: 101

反码: 010

补码: 011

因为是32位所以: 1111 1111 1111 1111 1111 1111 1111 1011

 

 1 class Test2
 2 {
 3     public static void main(String[]args)
 4     {
 5         StringBuffer sb = new StringBuffer();
 6         int num = 1234;
 7         while(num>0)
 8         {
 9             int temp = num % 16;
10             if(temp>9)
11             {
12                 sb.append((char)temp-10+'A');
13             }
14             else
15             {
16                 sb.append(temp);
17             }
18             num = num / 16;
19         }
20         System.out.println(sb);
21 
22     }
23 }

个人总结:
  总体来说今天的学习认真度还是很不够的!咱们要注意的地方就是:学习的时候不能分心.小细.一定不要输给别人看.

posted @ 2012-08-06 18:26 、小细 阅读(72) | 评论 (0)编辑 收藏
仅列出标题
共2页: 上一页 1 2