2015-08-04+05学习小结

今天的进度稍微有点紧张,周一计划的内容有些延后,今天又花了半天的时间完成。

一、继承:首先有反映一般事物特性的类,然后在此基础上反映出特殊事物的类。

  •继承是从一般特殊的关系。

  •好处:提高代码复用性、开发效率。让类与类之间产生关系,多态的前提。

1)子类与父类:

  •父类的私有成员子类不能继承到;

  •Java只可单继承,不可多继承;

  •一个类有且只有一个直接父类;

2)子类对象实例化过程:

  先调用父类无参的构造方法目的是为了对继承自父类的成员做初始化操作。

3)子类访问父类:

  •子类不能直接访问父类的私有成员;但子类可调用父类中的非私有方法来间接访问父类的私有成员。

4覆写父类方法:    

  •子类拓展父类(子类是父类的一种特殊情况)

    主要是以父类为基础,然后添加属于自己的字段和方法。

  •子类需要覆写父类方法。

    父类某个方法不适合子类本身特征行为时就要覆写父类中应当改变的方法。

5)方法的覆写:

  •当父类中某个方法不适合于子类时,子类出现父类一模一样的方法.

  •判断技:子类方法前加上@Override能编译通过,表明是方法的覆写。

  •调用被覆盖的父类方法:使用super.方法名(实参);

  •覆写原则:

    <一同>:方法签名必须相同;

    <两小>:子类方法的返回值类型比父类方法的返回值类型更小或相等;

        子类方法声明抛出的异常应比父类方法申明抛出的异常更小或相等;

    <一大>:子类方法的访问权限应比父类方法更大或相等;

6super关键字:

  •使用super调用父类的 方法 或 构造方法。

  •子类调用父类的构造方法时:super必须放在第一句

  •若子类构造方法中显式指定调用父类其他构造方法,就调用指定的父类构造方法,取消调用父类无参构造方法。

7this & super

  注:使用super()和this()在同一个构造方法中是不能同时显式出现。

二、多态:指同一个实体同时具有多种形式

  •编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给变量的对象决定。

  •如果编译时类型和运行时类型不同,就出现多态。

    如:面馆吃面,说我要吃面,那老板给我牛肉面、鸡蛋面等都可以;即"面"有多种形态,即实体有多种形态;

    Person p = new Person();

    Student s = new Student();

            Person     p     =     new     Student();

             |                                            |

编译时类型:声明的类型,把它看做是什么东西;          运行时类型:真正的类型,实际上指的是什么东西;

1)实现多态的机制:

  •父类的引用变量可指向子类的实例对象,而程序调用的方法在运行期才动态绑定,即引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

2多态的作用:

  •把不同的子类对象都当作父类来看,可屏蔽不同子类对象间的差异,写通用的代码,做通用的编程,以适应需求的不断变化;

  •只修改方法的实现,不必修改方法的声明;

3)多态的分类:

  •编译时多态:方法重载                          •运行时多态:方法覆写

    多态是用来屏蔽子类不同实现细节,例子是:

 1 class Dog{
 2
 3      public eat(){
 4
 5          System.out.println("我吃的是通用狗粮");
 6
 7      }
 8
 9 }
10
11 class Hashiqi extends Dog{
12
13      public eat(){
14
15         System.out.println("我吃的是哈士奇的专用狗粮");
16
17      }
18
19 }
20
21 class BeijingDog extends Dog{
22
23      public eat(){
24
25         System.out.println("我吃的是北京犬的专用狗粮");
26
27      }
28
29 }
30
31 public class Zoo{
32
33      //喂养
34
35      public static void feed(Dog d){
36
37         d.eat();
38
39      }
40
41      public static void main(String[] args){
42
43         Dog d1=new Hasiqi();
44
45         feed(d1);
46
47         Dog d2=new BeijingDog();
48
49         feed(d2);
50
51      }
52
53 }

    /**

    可以看到多态的好处就是,我统一了喂的方法。如果没有多态,我们只能在Zoo类这样写:

    public static void feed(Dog d);

    public static void feed(BeijingDog d);

    public static void feed(Hasiqi d);

    */


注意,多态的使用,一般都会出现三方,第一方是父类,第二方是子类,第三方是调用多态的方法。看完这个例子之后,通过画图,来描述调用的关系。

(4)引用变量类型转换:

  • 向上转型(子类→父类):(自动完成)

父类名称 父类对象 = 子类实例 ;

  • 向下转型(父类→子类):(强制完成)

子类名称 子类对象 = (子类名称)父类实例 ;

        对象名 instanceof 

  判断指定的变量名此时引用的真正类型是不是当前给出的类或子类;

  注意: 对象的 类型 和 类 必须有继承关系

  转型,也可以直接使用这个例子,什么时候会出现大--->小,就是在子类中有自己特定的方法的时候,需要强转。

  比如:

 1 class Hasiqi extends Dog{
 2
 3      public eat(){
 4
 5         System.out.println("我吃的是哈士奇的专用狗粮");
 6      }
 7
 8      public laxueqiao(){//拉雪橇
 9
10         System.out.println("我能拉雪橇");
11      }
12 }
13 class BeijingDog extends Dog{
14
15      public eat(){
16         System.out.println("我吃的是北京犬的专用狗粮");
17      }
18
19      public tiaoxi(){
20         System.out.println("我能被调戏");
21      }
22 }
23
24 .....main.....
25
26 public static void feed(Dog d){
27
28     d.eat();
29
30     if(d instanceof Hasiqi){
31
32          Hasiqi temp=(Hasiqi)d;
33
34          temp.laxueqiao();
35
36     }else if(d instanceof BeijingDog){
37
38          BeijingDog temp=(BeijingDog)d;
39
40          temp.tiaoxi();
41     }
42 }
43
44 这个例子能展示在真实应用当中的多态的使用方式。

(5)多态时方法的调用:

  •当一个引用类型的变量若声明为父类的类型,但实际上引用的是子类的对象(多态情况):

  •此时该变量不能再访问子类中自己特有的字段和方法;

  •若子类覆写了父类的方法,那么此时通过变量访问到的方法,实际上是子类的方法;

 

三、包装类说明:

   除了Integer和Character定义的名称和对应的基本类型差异大,其他六种都是将首字母大写就可以了;除了Character和Boolean是都是Object直接子类外,另外6个是Number类的子类;且这8个类都是final修饰的(不可被继承)。

1)基本数据类型和包装类相互转换:

  •把基本数据类型包装类:

    通过对应包装类的构造方法实现;除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象。

  •包装类基本数据类型:

    包装类的实例方法xxxValue();    // xxx表示包装类对应的基本数据类型

2)自动装箱&自动拆箱:

  自动装箱:可把一个基本类型变量直接赋给对应的包装类对象或则Object对象

  自动拆箱:允许把 包装类对象直接赋给对应的基本数据类型

    Integer i = 3;//装箱

    int i2 = i;//拆箱

    Object flag = new Boolean(false);

      if(flag instanceof Boolean){

      Boolean b = (Boolean)flag;

      boolean b2 = b;

    }

3)基本类型和String之间的转换:

  String → 基本类型:

    除了Character外所有的包装类提供parseXxx(String s)静态方法,用于把一个特定的字符串转换成基本类型变量;

  基本类型 → String:

    String 类有静态方法valueOf(),用于将基本类型的变量转换成String类型。

4Object类:

  •所有类的公共父类,一旦一个类没有显示地继承一个类则其直接父类一定是Object类且一切数据类型都可用Object接收。

    class OOXX extends Object{}等价于class ooXX {}

  •常见方法

    public boolean equals(Object obj):对象比较

    public int hashCode():取得该对象的Hash码

  public String toString():对象描述

    •建议所有类都覆写此方法

    •直接打印输出对象时,会调用该对象的toString()方法。

    •打印对象的时候,实际调用的对象实际指向的类的自我描述;

    •全限定类名[email protected]+十六进制的hashCode值,等价于全限定类名[email protected]+IntegertoHexString(该对象.hashCode)

四、Singleton模式(单态模式)

  目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例。

  好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人;

  常见单例模式类型:

  • 饿汉式单例
  • 懒汉式单例

l  懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

l  饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

l  这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重 量级对象来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行 时第一次获得对象的速度慢。

l  从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式。

Singleton(饿汉模式)

 1 Singleton(饿汉模式)
 2
 3 class Singleton
 4
 5 {
 6
 7       ///在内部准备好一个对象
 8
 9       private static Singleton instance = new Singleton();
10
11       public static Singleton getInstance(){
12
13            return instance;
14
15       }
16
17       private Singleton(){}
18
19       public void show(){
20
21            System.out.println("Singleton");
22
23       }
24
25 }

 

Singleton(懒汉模式)

 1 Singleton(懒汉模式)
 2
 3 class Singleton{
 4
 5    private static Singleton instance = null;
 6
 7    public static Singleton getInstance(){// 将instance传递到外部去
 8
 9         if(instance == null){
10
11               instance = new Singleton();
12
13         }
14
15         return instance;
16
17    }
18
19    private Singleton(){}
20
21 }
22
23 //更完美的写法,避免多线程创建多个实例  ----->双重检查锁定
24
25 public static Singleton2  getInstance() {
26
27                 if(instance==null)
28
29                 {
30
31                        synchronized(Singleton2.class)
32
33                         {
34
35                                 if(instance==null)
36
37                                 instance = new Singleton2();
38
39                         }
40
41                 }
42
43                 return instance ;
44
45         }

enum实现单例模式

  l  使用枚举来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。

 1 public enum Singleton {
 2
 3 INSTANCE;//唯一实例
 4
 5 public static Singleton getInstance(){
 6
 7 return INSTANCE;
 8
 9 }
10
11 public void show(){
12
13 System.out.println("使用enum实现单例模式");
14
15 }
16
17 }

final关键字

  ①    final可以修饰类,方法,变量。

  ②    final修饰类不可以被继承,但是可以继承其他类。

  ③    final修饰的方法不可以被覆盖,但可以覆盖父类方法。

  ④    final修饰的变量称为常量,这些变量只能赋值一次。

  ⑤    内部类在局部时,只可以访问被final修饰的局部变量。

      final修饰的引用类型变量,表示该变量的引用不能变,而不是该变量的值不能变;

  

    通常规范中:常量名称所有字母大写,若有多个单词组成,单词间使用下划线连接。

      public static final修饰的常量称为全局常量;

抽象类的引入:abstract 关键字

  可以定义被abstract修饰的抽象方法

    抽象方法只有返回类型和方法签名(方法名 + 参数列表),没有方法体。

  抽象类可以含有普通方法

  抽象类不能创建实例对象(不能new)

  需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类

  流的四个基本父类

    InputStream,OutputStream,Reader,Writer

abstract方法

  分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。

  那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

     abstract [非private访问修饰符] 返回值类型 方法名称(参数列表);

  抽象方法要存放在抽象类中。

  抽象方法也可以存在于接口中

 

时间: 2024-10-11 02:25:23

2015-08-04+05学习小结的相关文章

Murano Weekly Meeting 2015.08.04

Meeting time: 2015.August.4th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting summary: 1.Migrating to yaql 1.0 status.    PIC:       Stan Lagun    Status:   All commits are on review but not yet merged. New yaql engine should be full

2017/04/05学习笔记

栈的应用 案例1:就近匹配几乎所有的编译器都具有检测括号是否匹配的能力如何实现编译器中的符号成对检测?#include <stdio.h> int main(){int a[4][4];int (*p)[4];p =a[0];return ;算法思路从第一个字符开始扫描当遇见普通字符时忽略当遇见左符号时压入栈中当遇见右符号时从栈中弹出栈顶符号,并进行匹配匹配成功:继续读入下一个字符匹配失败:立即停止,并报错结束:成功:所以字符扫描完毕,且栈为空失败:匹配失败或所有字符扫描完毕但栈非空当需要继承

&lt;2014 08 28&gt; 大学学习小结

大一:哲学.物理(科普).瞎玩 大二:机械.力学.继续哲学 大三:电子电路.计算机.编程 大四:毕业项目(机器人等) 研一:物理.数学(常熟) 研二:AGV.TUM实习 研三:写论文.实习程序员.申请出国 博一:物理.数学.论文阅读 ... (第一个月开始) ... 待续 ...

17.2015.08.04第十八节课 C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)

一.数值类型及其调用原理 名称 说明 所占字节 范围 byte 字节型 1 -27~27-1 short 短整型 2 -215~215-1 int 整型 4 -231~231-1 long 长整型 8 -263~263-1 char 字符型 1 0~65535 float 单精度型 4 ±1.5*10-45~±3.4*1038 double 双精度型 8 ±5.0*10-324~±1.7*10308 bool 布尔型 1 只有true和false两个值 static void Main(stri

2015/08/10 ios杂项小结

凭着没有项目经验,自己在此进了另一家互联网公司--早点科技. 今天本来是要看一些官方文档的,可结果发现自己对macbook都不熟,在此记录下有关操作技巧. 1. 在macbook上如何使用svn从服务器上下载项目.这个我是从李明杰老师的博客里面发现的,收益匪浅. http://blog.csdn.net/q199109106q/article/details/8655204 1>. 创建代码仓库用来存储客户端所上传的代码 2>. 配置svn的用户权限 3>. 使用svn客户端功能 这里面

2015.11.04 学习 Ubuntu下安装gocode

2015.11.04 学习 Ubuntu下安装gocode 1.go get github.com/nsf/gocode,如果不成功 2.网页http://github.com/nsf/gocode,下载包,然后解压,解压后的文件名为gocode-master,修改为gocode. 3.复制gocode文件夹到go的安装目录~/go/github.com/nsf/gocode,(没有的话自行创建) 4.然后命令行执行go install github.com/nsf/gocode.确保安装目录的

新手C#string类常用函数的学习2018.08.04

ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower(); 这可以使用户的输入不区分大小写,例如验证码. ToUpper()用于将字符串全部变为大写,与上面类似. Trim()可以用于去掉两边的空格. string s1 = " a b c "; s1 = s1.Trim();//用于去除字符串两边的空格 Console.WriteLine

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘

第三章学习小结—-转

[学习目标] 01掌握一维数组的声明和使用方法(OK) 02掌握二维数组的声明和使用方法(OK) 03掌握字符串的声明.赋值.比较和连接方法(连接很少用) 04熟悉字符的ASCII码和ctype.h中的字符函数 05正确认识++.+=等能修改变量的运算符(OK) 06学会用编译选项-Wall获得更多的警告信息(OK) 07了解不同操作系统中换行符的表示方法(嗯) 08掌握fgetc和getchar的使用方法(fgetc基本没用过) 09掌握预处理和迭代开发的技巧(嗯) 程序3-1 逆序输出 输入